DateTime類 DateTime類是C#中最常用的時間類之一,它表示一個日期和時間。可以使用DateTime.Now屬性獲取當前時間,也可以使用DateTime.Parse方法將字元串轉換為DateTime對象。 // 獲取當前時間 DateTime now = DateTime.Now; // ...
DateTime類
DateTime類是C#中最常用的時間類之一,它表示一個日期和時間。可以使用DateTime.Now屬性獲取當前時間,也可以使用DateTime.Parse方法將字元串轉換為DateTime對象。
// 獲取當前時間
DateTime now = DateTime.Now;
// 將字元串轉換為DateTime對象
DateTime dateTime = DateTime.Parse("2022-01-01 12:00:00");
// 獲取當前時間的年份
int year = now.Year;
// 獲取當前時間的月份
int month = now.Month;
// 獲取當前時間的日期
int day = now.Day;
// 獲取當前時間的小時數
int hour = now.Hour;
// 獲取當前時間的分鐘數
int minute = now.Minute;
// 獲取當前時間的秒數
int second = now.Second;
// 獲取當前時間的毫秒數
int millisecond = now.Millisecond;
DateTime類還提供了一些常用的方法和屬性,例如:
- DateTime.AddDays(double value):將當前DateTime對象的日期加上指定的天數。
- DateTime.AddHours(double value):將當前DateTime對象的時間加上指定的小時數。
- DateTime.AddMinutes(double value):將當前DateTime對象的時間加上指定的分鐘數。
- DateTime.AddSeconds(double value):將當前DateTime對象的時間加上指定的秒數。
- DateTime.Year:獲取當前DateTime對象的年份。
- DateTime.Month:獲取當前DateTime對象的月份。
- DateTime.Day:獲取當前DateTime對象的日期。
- DateTime.Hour:獲取當前DateTime對象的小時數。
- DateTime.Minute:獲取當前DateTime對象的分鐘數。
- DateTime.Second:獲取當前DateTime對象的秒數。
TimeSpan類
TimeSpan類表示時間間隔,可以用來計算兩個日期之間的時間差。可以使用TimeSpan.FromDays、TimeSpan.FromHours、TimeSpan.FromMinutes、TimeSpan.FromSeconds等方法創建TimeSpan對象。
// 創建一個表示1天的TimeSpan對象
TimeSpan oneDay = TimeSpan.FromDays(1);
// 創建一個表示2小時的TimeSpan對象
TimeSpan twoHours = TimeSpan.FromHours(2);
// 創建一個表示30分鐘的TimeSpan對象
TimeSpan thirtyMinutes = TimeSpan.FromMinutes(30);
// 創建一個表示10秒的TimeSpan對象
TimeSpan tenSeconds = TimeSpan.FromSeconds(10);
TimeSpan類還提供了一些常用的方法和屬性,例如:
- TimeSpan.TotalDays:獲取TimeSpan對象表示的總天數。
- TimeSpan.TotalHours:獲取TimeSpan對象表示的總小時數。
- TimeSpan.TotalMinutes:獲取TimeSpan對象表示的總分鐘數。
- TimeSpan.TotalSeconds:獲取TimeSpan對象表示的總秒數。
DateTimeOffset類
DateTimeOffset類表示一個日期和時間,同時包含時區信息。可以使用DateTimeOffset.Now屬性獲取當前時間,也可以使用DateTimeOffset.Parse方法將字元串轉換為DateTimeOffset對象。
// 獲取當前時間
DateTimeOffset now = DateTimeOffset.Now
// 將字元串轉換為DateTimeOffset對象
DateTimeOffset dateTimeOffset = DateTimeOffset.Parse("2022-01-01 12:00:00 +08:00");
DateTimeOffset類還提供了一些常用的方法和屬性,例如:
- DateTimeOffset.ToLocalTime():將當前DateTimeOffset對象轉換為本地時間。
- DateTimeOffset.ToUniversalTime():將當前DateTimeOffset對象轉換為協調世界時(UTC)時間。
靜態類的封裝
using System;
namespace ToolBox.DateTimeTool
{
public static class DateTimeExtend
{
/// <summary>
/// 獲取本日開始時間(0點0分0秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetDayStart(this DateTime dateTime)
{
return dateTime.Date;
}
/// <summary>
/// 獲取本日結束時間(23點59分59秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetDayEnd(this DateTime dateTime)
{
return dateTime.Date.AddDays(1).AddMilliseconds(-1);
}
/// <summary>
/// 獲取本周開始時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetWeekStart(this DateTime dateTime)
{
return dateTime.AddDays(-(int)dateTime.DayOfWeek + 1).GetDayStart();
}
/// <summary>
/// 獲取本周結束時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetWeekEnd(this DateTime dateTime)
{
return dateTime.AddDays(7 - (int)dateTime.DayOfWeek).GetDayEnd();
}
/// <summary>
/// 獲取本月開始時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetMonthStart(this DateTime dateTime)
{
return new DateTime(dateTime.Year, dateTime.Month, 1, 0, 0, 0, 0);
}
/// <summary>
/// 獲取本月結束時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetMonthEnd(this DateTime dateTime)
{
return GetMonthStart(dateTime).AddMonths(1).AddMilliseconds(-1);
}
/// <summary>
/// 獲取本季度開始時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetSeasonStart(this DateTime dateTime)
{
var time = dateTime.AddMonths(0 - ((dateTime.Month - 1) % 3));
return DateTime.Parse(time.AddDays(-time.Day + 1).ToString("yyyy/MM/dd 00:00:00"));
}
/// <summary>
/// 獲取本季度結束時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetSeasonEnd(this DateTime dateTime)
{
var time = dateTime.AddMonths((3 - ((dateTime.Month - 1) % 3) - 1));
return DateTime.Parse(time.AddMonths(1).AddDays(-time.AddMonths(1).Day + 1).AddDays(-1).ToString("yyyy/MM/dd 23:59:59"));
}
/// <summary>
/// 獲取本年開始時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetYearStart(this DateTime dateTime)
{
return DateTime.Parse(dateTime.AddDays(-dateTime.DayOfYear + 1).ToString("yyyy/MM/dd 00:00:00"));
}
/// <summary>
/// 獲取本年結束時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetYearEnd(this DateTime dateTime)
{
var time2 = dateTime.AddYears(1);
return DateTime.Parse(time2.AddDays(-time2.DayOfYear).ToString("yyyy/MM/dd 23:59:59"));
}
/// <summary>
/// 北京時間轉換成unix時間戳(10位/秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static long BeijingTimeToUnixTimeStamp10(this DateTime dateTime)
{
return (long)(dateTime - new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds;
}
/// <summary>
/// 格林威治時間轉換成unix時間戳(10位/秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static long UtcTimeToUnixTimeStamp10(this DateTime dateTime)
{
return (long)(dateTime - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
}
/// <summary>
/// 北京時間轉換成unix時間戳(13位/毫秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static long BeijingTimeToUnixTimeStamp13(this DateTime dateTime)
{
return (long)(dateTime - new DateTime(1970, 1, 1, 8, 0, 0)).TotalMilliseconds;
}
/// <summary>
/// 格林威治時間轉換成unix時間戳(13位/毫秒)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static long UtcTimeToUnixTimeStamp13(this DateTime dateTime)
{
return (long)(dateTime - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds;
}
/// <summary>
/// 10位unix時間戳轉換成北京時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime UnixTimeStamp10ToBeijingTime(this long unixTimeStamp)
{
return new DateTime(1970, 1, 1, 8, 0, 0).AddSeconds(unixTimeStamp);
}
/// <summary>
/// 10位unix時間戳轉換成格林威治
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime UnixTimeStamp10ToUtcTime(this long unixTimeStamp)
{
return new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(unixTimeStamp);
}
/// <summary>
/// 13位unix時間戳轉換成北京時間
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime UnixTimeStamp13ToBeijingTime(this long unixTimeStamp)
{
return new DateTime(1970, 1, 1, 8, 0, 0).AddMilliseconds(unixTimeStamp);
}
/// <summary>
/// 13位unix時間戳轉換成格林威治
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime UnixTimeStamp13ToUtcTime(this long unixTimeStamp)
{
return new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(unixTimeStamp);
}
/// <summary>
/// 當前日期所在月份第一個指定星期幾的日期
/// </summary>
/// <param name="date">給定日期</param>
/// <param name="dayOfWeek">星期幾</param>
/// <returns>所對應的日期</returns>
public static DateTime GetFirstWeekDayOfMonth(this DateTime date, DayOfWeek dayOfWeek)
{
var dt = date.GetMonthStart();
while (dt.DayOfWeek != dayOfWeek)
dt = dt.AddDays(1);
return dt;
}
/// <summary>
/// 當前日期所在月份最後1個指定星期幾的日期
/// </summary>
/// <param name="date">給定日期</param>
/// <param name="dayOfWeek">星期幾</param>
/// <returns>所對應的日期</returns>
public static DateTime GetLastWeekDayOfMonth(this DateTime date, DayOfWeek dayOfWeek)
{
var dt = date.GetMonthEnd();
while (dt.DayOfWeek != dayOfWeek)
dt = dt.AddDays(-1);
return dt;
}
/// <summary>
/// 判斷是否比指定之間早
/// </summary>
/// <param name="date"></param>
/// <param name="other"></param>
/// <returns></returns>
public static bool IsBefore(this DateTime date, DateTime other)
{
return date < other;
}
/// <summary>
/// 判斷是否比指定時間晚
/// </summary>
/// <param name="date"></param>
/// <param name="other"></param>
/// <returns></returns>
public static bool IsAfter(this DateTime date, DateTime other)
{
return date > other;
}
/// <summary>
/// 給定日期所在月份共有多少天
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static int GetCountDaysOfMonth(this DateTime date)
{
return date.GetMonthEnd().Day;
}
/// <summary>
/// 當前日期與給定日期是否是同一天
/// </summary>
/// <param name="date">當前日期</param>
/// <param name="dateToCompare">給定日期</param>
/// <returns></returns>
public static bool IsDateEqual(this DateTime date, DateTime dateToCompare)
{
return date.Date == dateToCompare.Date;
}
/// <summary>
/// 是否是周未
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static bool IsWeekend(this DateTime date)
{
return date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday;
}
/// <summary>
/// 是否是工作日
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static bool IsWeekDay(this DateTime date)
{
return !date.IsWeekend();
}
/// <summary>
/// 判斷是否為今天
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static bool IsToday(this DateTime date)
{
return date.Date == DateTime.Now.Date;
}
/// <summary>
/// 判定西曆閏年遵循的一般規律為:四年一閏,百年不閏,四百年再閏。
/// 西曆閏年的精確計算方法:(按一回歸年365天5小時48分45.5秒)
/// 普通年能被4整除而不能被100整除的為閏年。 (如2004年就是閏年,1900年不是閏年)
/// 世紀年能被400整除而不能被3200整除的為閏年。 (如2000年是閏年,3200年不是閏年)
/// 對於數值很大的年份能整除3200,但同時又能整除172800則又是閏年。(如172800年是閏年,86400年不是閏年)
/// 公元前閏年規則如下:
/// 非整百年:年數除4餘數為1是閏年,即公元前1、5、9……年;
/// 整百年:年數除400餘數為1是閏年,年數除3200餘數為1,不是閏年,年數除172800餘1又為閏年,即公元前401、801……年。
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static bool IsLeap(this DateTime dateTime)
{
var year = dateTime.Year;
if ((year % 400 == 0 && year % 3200 != 0)
|| (year % 4 == 0 && year % 100 != 0)
|| (year % 3200 == 0 && year % 172800 == 0))
return true;
else
return false;
}
/// <summary>
/// 獲取當前年天數
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static int GetDaysByYear(this DateTime dateTime)
{
return (new DateTime(dateTime.Year + 1, 1, 1) - new DateTime(dateTime.Year, 1, 1)).Days;
}
/// <summary>
/// 獲取當前年天數
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static int GetWeekCountByYear(this DateTime dateTime)
{
//找到今年的第一天是周幾
int firstWeekend = Convert.ToInt32(DateTime.Parse(dateTime.Year + "-1-1").DayOfWeek);
//獲取第一周的差額,如果是周日,則firstWeekend為0,第一周也就是從周天開始的。
int weekDay = firstWeekend == 0 ? 1 : (7 - firstWeekend + 1);
//獲取今天是一年當中的第幾天
int currentDay = dateTime.DayOfYear;
//(今天 減去 第一周周末)/7 等於 距第一周有多少周 再加上第一周的1 就是今天是今年的第幾周了
// 剛好考慮了惟一的特殊情況就是,今天剛好在第一周內,那麼距第一周就是0 再加上第一周的1 最後還是1
int current_week = Convert.ToInt32(Math.Ceiling((currentDay - weekDay) / 7.0)) + 1;
return current_week;
}
}
}