/// <summary> /// Gets first day of year /// </summary> /// <param name="dt"></param> /// <param name="dayOfWeek"></param> /// <returns></returns> public static DateInfo GetFirstDayInfoOfYear(this DateTime dt, DayOfWeek dayOfWeek) { var t = DateTimeFactory.Create(dt.Year, 1, 1); while (t.DayOfWeek != dayOfWeek) { t = t.AddDays(-1); } return(t); }
public static int GetTargetDays(int year, int month, int weekAtMonth, int dayOfWeek) { var fd = DateTimeFactory.Create(year, month, 1); var daysNeeded = dayOfWeek - (int)fd.DayOfWeek; if (daysNeeded < 0) { daysNeeded += 7; } return((daysNeeded + 1) + (7 * (weekAtMonth - 1))); }
/// <summary> /// Previous Year /// </summary> /// <param name="dt"></param> /// <returns></returns> public static DateTime PreviousYear(this DateTime dt) { var year = dt.Year - 1; var daysOfMonth = DateTime.DaysInMonth(year, dt.Month); if (daysOfMonth == dt.Day) { return(DateTimeFactory.Create(year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond, dt.Kind)); } var d = dt.Day - daysOfMonth; var p = DateTimeFactory.Create(year, dt.Month, daysOfMonth, dt.Hour, dt.Minute, dt.Second, dt.Millisecond, dt.Kind); return(p + d.Days()); }
/// <summary> /// Create <see cref="DateTime"/> by special year, month and offset info.<br /> /// 根据指定的年月和偏移信息创建 <see cref="DateTime"/> /// </summary> /// <param name="year"></param> /// <param name="month"></param> /// <param name="weekAtMonth"></param> /// <param name="dayOfWeek"></param> /// <returns></returns> public static DateTime OffsetByWeek(int year, int month, int weekAtMonth, int dayOfWeek) { if (weekAtMonth == 0 || weekAtMonth > 5) { throw new ArgumentException("weekAtMonth is invalid.", nameof(weekAtMonth)); } var targetDay = DateTimeCalcHelper.GetTargetDays(year, month, weekAtMonth, dayOfWeek); if (targetDay > DateTime.DaysInMonth(year, month)) { return(DateTime.MinValue); } return(DateTimeFactory.Create(year, month, targetDay)); }
/// <summary> /// Create <see cref="DateInfo"/> by special year, month and offset info.<br /> /// 根据指定的年月和偏移信息创建 <see cref="DateInfo"/> /// </summary> /// <param name="year"></param> /// <param name="month"></param> /// <param name="weekAtMonth"></param> /// <param name="dayOfWeek"></param> /// <param name="result"></param> /// <returns></returns> public static bool TryOffsetByWeek(int year, int month, int weekAtMonth, int dayOfWeek, out DateInfo result) { if (weekAtMonth == 0 || weekAtMonth > 5) { throw new ArgumentException("weekAtMonth is invalid.", nameof(weekAtMonth)); } var targetDay = DateTimeCalcHelper.GetTargetDays(year, month, weekAtMonth, dayOfWeek); var invalid = targetDay > DateTime.DaysInMonth(year, month); result = invalid ? DateTime.MinValue : DateTimeFactory.Create(year, month, targetDay); return(!invalid); }
/// <summary> /// Set time /// </summary> /// <param name="dt"></param> /// <param name="millisecond"></param> /// <returns></returns> public static DateTime SetMillisecond(this DateTime dt, int millisecond) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, millisecond, dt.Kind);
/// <summary> /// Set time /// </summary> /// <param name="dt"></param> /// <param name="hour"></param> /// <param name="minute"></param> /// <param name="second"></param> /// <param name="millisecond"></param> /// <returns></returns> public static DateTime SetTime(this DateTime dt, int hour, int minute, int second, int millisecond) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, hour, minute, second, millisecond, dt.Kind);
/// <summary> /// Set date /// </summary> /// <param name="dt"></param> /// <param name="year"></param> /// <returns></returns> public static DateTime SetYear(this DateTime dt, int year) => DateTimeFactory.Create(year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond, dt.Kind);
/// <summary> /// Set date /// </summary> /// <param name="dt"></param> /// <param name="year"></param> /// <param name="month"></param> /// <param name="day"></param> /// <returns></returns> public static DateTime SetDate(this DateTime dt, int year, int month, int day) => DateTimeFactory.Create(year, month, day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond, dt.Kind);
/// <summary> /// End of day (timezone-adjusted) /// </summary> /// <param name="dt"></param> /// <param name="timeZoneOffset"></param> /// <returns></returns> public static DateTime EndOfDay(this DateTime dt, int timeZoneOffset) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, 23, 59, 59, 999, dt.Kind).AddHours(timeZoneOffset);
/// <summary> /// End of day /// </summary> /// <param name="dt"></param> /// <returns></returns> public static DateTime EndOfDay(this DateTime dt) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, 23, 59, 59, 999, dt.Kind);
/// <summary> /// To Datetime /// </summary> /// <param name="lt"></param> /// <param name="day"></param> /// <param name="kind"></param> /// <param name="year"></param> /// <param name="month"></param> /// <returns></returns> public static DateTime ToDateTime(this LocalTime lt, int year, int month, int day, DateTimeKind kind) => DateTimeFactory.Create(year, month, day, lt.Hour, lt.Minute, lt.Second, lt.Millisecond, kind);
/// <summary> /// Beginning of day /// </summary> /// <param name="dt"></param> /// <param name="timeZoneOffset"></param> /// <returns></returns> public static DateTime BeginningOfDay(this DateTime dt, int timeZoneOffset) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0, dt.Kind).AddHours(timeZoneOffset);
/// <summary> /// Beginning of day /// </summary> /// <param name="dt"></param> /// <returns></returns> public static DateTime BeginningOfDay(this DateTime dt) => DateTimeFactory.Create(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0, dt.Kind);
/// <summary> /// Convert <see cref="DateTime"/> to Epoch time span. /// </summary> /// <param name="dt"></param> /// <returns></returns> public static TimeSpan ToEpochTimeSpan(this DateTime dt) => dt.Subtract(DateTimeFactory.Create(1970, 1, 1));
/// <summary> /// To Datetime /// </summary> /// <param name="ld"></param> /// <param name="kind"></param> /// <returns></returns> public static DateTime ToDateTime(this LocalDate ld, DateTimeKind kind) => DateTimeFactory.Create(ld.Year, ld.Month, ld.Day, 0, 0, 0, 0, kind);