mirror of
https://github.com/ldqk/Masuit.Tools.git
synced 2026-10-26 10:49:48 +08:00
122 lines
4.4 KiB
C#
122 lines
4.4 KiB
C#
using System;
|
|
using System.Globalization;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Masuit.Tools.DateTimeExt
|
|
{
|
|
/// <summary>
|
|
/// 日期时间帮助类
|
|
/// </summary>
|
|
public static class DateTimeHelper
|
|
{
|
|
/// <summary>
|
|
/// 获取某一年有多少周
|
|
/// </summary>
|
|
/// <param name="_"></param>
|
|
/// <param name="year">年份</param>
|
|
/// <returns>该年周数</returns>
|
|
public static int GetWeekAmount(this DateTime _, int year)
|
|
{
|
|
var end = new DateTime(year, 12, 31); //该年最后一天
|
|
var gc = new GregorianCalendar();
|
|
return gc.GetWeekOfYear(end, CalendarWeekRule.FirstDay, DayOfWeek.Monday); //该年星期数
|
|
}
|
|
|
|
/// <summary>
|
|
/// 返回年度第几个星期 默认星期日是第一天
|
|
/// </summary>
|
|
/// <param name="date">时间</param>
|
|
/// <returns>第几周</returns>
|
|
public static int WeekOfYear(this DateTime date)
|
|
{
|
|
var gc = new GregorianCalendar();
|
|
return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 返回年度第几个星期
|
|
/// </summary>
|
|
/// <param name="date">时间</param>
|
|
/// <param name="week">一周的开始日期</param>
|
|
/// <returns>第几周</returns>
|
|
public static int WeekOfYear(this DateTime date, DayOfWeek week)
|
|
{
|
|
var gc = new GregorianCalendar();
|
|
return gc.GetWeekOfYear(date, CalendarWeekRule.FirstDay, week);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 得到一年中的某周的起始日和截止日
|
|
/// 年 nYear
|
|
/// 周数 nNumWeek
|
|
/// 周始 out dtWeekStart
|
|
/// 周终 out dtWeekeEnd
|
|
/// </summary>
|
|
/// <param name="_"></param>
|
|
/// <param name="nYear">年份</param>
|
|
/// <param name="nNumWeek">第几周</param>
|
|
/// <param name="dtWeekStart">开始日期</param>
|
|
/// <param name="dtWeekeEnd">结束日期</param>
|
|
public static void GetWeekTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd)
|
|
{
|
|
var dt = new DateTime(nYear, 1, 1);
|
|
dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0);
|
|
dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday);
|
|
dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 得到一年中的某周的起始日和截止日 周一到周五 工作日
|
|
/// </summary>
|
|
/// <param name="_"></param>
|
|
/// <param name="nYear">年份</param>
|
|
/// <param name="nNumWeek">第几周</param>
|
|
/// <param name="dtWeekStart">开始日期</param>
|
|
/// <param name="dtWeekeEnd">结束日期</param>
|
|
public static void GetWeekWorkTime(this DateTime _, int nYear, int nNumWeek, out DateTime dtWeekStart, out DateTime dtWeekeEnd)
|
|
{
|
|
var dt = new DateTime(nYear, 1, 1);
|
|
dt += new TimeSpan((nNumWeek - 1) * 7, 0, 0, 0);
|
|
dtWeekStart = dt.AddDays(-(int)dt.DayOfWeek + (int)DayOfWeek.Monday);
|
|
dtWeekeEnd = dt.AddDays((int)DayOfWeek.Saturday - (int)dt.DayOfWeek + 1).AddDays(-2);
|
|
}
|
|
|
|
#region P/Invoke 设置本地时间
|
|
|
|
[DllImport("kernel32.dll")]
|
|
private static extern bool SetLocalTime(ref SystemTime time);
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct SystemTime
|
|
{
|
|
public short year;
|
|
public short month;
|
|
public short dayOfWeek;
|
|
public short day;
|
|
public short hour;
|
|
public short minute;
|
|
public short second;
|
|
public short milliseconds;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置本地计算机时间
|
|
/// </summary>
|
|
/// <param name="dt">DateTime对象</param>
|
|
public static void SetLocalTime(this DateTime dt)
|
|
{
|
|
SystemTime st;
|
|
st.year = (short)dt.Year;
|
|
st.month = (short)dt.Month;
|
|
st.dayOfWeek = (short)dt.DayOfWeek;
|
|
st.day = (short)dt.Day;
|
|
st.hour = (short)dt.Hour;
|
|
st.minute = (short)dt.Minute;
|
|
st.second = (short)dt.Second;
|
|
st.milliseconds = (short)dt.Millisecond;
|
|
SetLocalTime(ref st);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |