C# 日期和时间 DateTime, DateTimeOffset

C# 有一个自带的类型 DateTime 可以用来处理日期和时间。

我们可以用new 或者 default为创建一个默认的DateTime 对象.

var dt = new DateTime(); // 默认值 01/01/0001 00:00:00
DateTime d2 = default;

DateTime 对象的默认值和最小值是 0001 年 1 月 1 日 00:00:00(午夜)。 最大值可以是 9999 年 12 月 31 日晚上 11:59:59。 使用 DateTime 结构的不同构造函数为 DateTime 对象分配初始值。

//默认值 01/01/0001 00:00:00
var dt1 = new DateTime(); 

//年 月 日
var dt2 = new DateTime(2015, 12, 31); 

//年 月 日 小时 分钟 秒
var dt3 = new DateTime(2015, 12, 31, 5, 10, 20);
 
//年 月 日 小时 分钟 秒 UTC 时区   UTC 协调世界时。 北京时间是UTC+8 (某些有夏令时的国家跟UTC的时间差还不是固定的)
var dt4 = new DateTime(2015, 12, 31, 5, 10, 20, DateTimeKind.Utc);

在上面的例子中,我们在构造函数中指定了年、月和日。 年可以是 0001 到 9999,月可以是 1 到 12,日可以是 1 到 31。设置这些范围之外的任何其他值都会导致运行时异常。

var dt = new DateTime(2021, 12, 32); //System.ArgumentOutOfRangeException:“Year, Month, and Day parameters describe an un-representable DateTime.”

DateTime 的静态字段

DateTime 结构包括静态字段、属性和方法。 以下示例演示了重要的静态字段和属性。

var currentDateTime = DateTime.Now;  // 当前的时间含有日期
var todaysDate = DateTime.Today; // 当前的日期,时间是00:00:00
var currentDateTimeUTC = DateTime.UtcNow;// UTC的当前时间

var maxDateTimeValue = DateTime.MaxValue; // 最大值
var minDateTimeValue = DateTime.MinValue; // 最小值

ticks

Ticks 表示的是,以公历 0001 年 1 月 1 日 00:00:00.000 以来经过的 100 纳秒间隔数。 (1毫秒=1000微秒=1000纳秒)

var now = DateTime.Now;
var ts = now - DateTime.MinValue;
Console.WriteLine(ts.TotalMilliseconds); //63758508023066.8
Console.WriteLine(now.Ticks);            //637585080230668448 可以看到差10000倍

DateTime.MinValue.Ticks.Dump();  //min value of ticks
DateTime.MaxValue.Ticks.Dump(); // max value of ticks

TimeSpan

TimeSpan 是一个结构体,用于表示以天、小时、分钟、秒和毫秒为单位的时间。 主要是用来表示两段时间的差值

var now = DateTime.Now;
var oneDayAgo =DateTime.Now.AddDays(-1);
var ts1 = now - oneDayAgo; //1.00:00:00
var ts2 = now.Subtract(oneDayAgo);//1.00:00:00

两个值是一样的

运算符 Operators

DateTime有自定义了常见的一些运算符,使我们可以方便的使用 + - <> 进行操作

var dt1 = new DateTime(2015, 12, 20);
var dt2 = new DateTime(2016, 12, 31, 5, 10, 20); 
var time = new TimeSpan(10, 5, 25, 50);

Console.WriteLine(dt2 + time); // 1/10/2017 10:36:10 AM
Console.WriteLine(dt2 - dt1); //377.05:10:20
Console.WriteLine(dt1 == dt2); //False
Console.WriteLine(dt1 != dt2); //True
Console.WriteLine(dt1 > dt2); //False
Console.WriteLine(dt1 < dt2); //True
Console.WriteLine(dt1 >= dt2); //False
Console.WriteLine(dt1 <= dt2);//True

把时间转成字符串

DateTime 结构包括以下将日期和时间转换为字符串的方法。

方法 说明 中文下的结果
ToString 将 DateTime 值转换为当前区域性的指定格式的字符串。 2021/6/5 16:53:06
ToShortDateString 将 DateTime 值转换为当前区域性中的短日期字符串(M/d/yyyy 模式)。 2021/6/5
ToShortTimeString 将 DateTime 值转换为当前区域性中的短时间字符串(h:mm:ss 模式)。 16:54
ToLongDateString 将 DateTime 值转换为当前区域性中的长日期字符串(dddd、MMMM d、yyyy 模式)。 2021年6月5日
ToLongTimeString 将 DateTime 值转换为当前区域性中的长时间字符串(h:mm:ss tt 模式)。 16:54:54

除了上面的这些方法,我们还可以完全自定义格式来输出 三个MMM会输出月份的名称,ddd会输出星期几 tt 会输出 下午

var dt = DateTime.Now;
Console.WriteLine("Date String Current Culture: " + dt.ToString("d"));
Console.WriteLine("MM/dd/yyyy Format: " + dt.ToString("MM/dd/yyyy"));
Console.WriteLine("dddd, dd MMMM yyyy Format: " + dt.ToString("dddd, dd MMMM yyyy"));
Console.WriteLine("MM/dd/yyyy h:mm tt Format: " + dt.ToString("MM/dd/yyyy h:mm tt"));
Console.WriteLine("MMMM dd Format:" + dt.ToString("MMMM dd"));

// 结果
// Date String Current Culture: 2021/6/5
// MM/dd/yyyy Format: 06/05/2021
// dddd, dd MMMM yyyy Format: 星期六, 05 六月 2021
// MM/dd/yyyy h:mm tt Format: 06/05/2021 4:56 下午
// MMMM dd Format:六月 05

在英语的环境下

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
var dt = DateTime.Now;
Console.WriteLine("Date String Current Culture: " + dt.ToString("d"));
Console.WriteLine("MM/dd/yyyy Format: " + dt.ToString("MM/dd/yyyy"));
Console.WriteLine("dddd, dd MMMM yyyy Format: " + dt.ToString("dddd, dd MMMM yyyy"));
Console.WriteLine("MM/dd/yyyy h:mm tt Format: " + dt.ToString("MM/dd/yyyy h:mm tt"));
Console.WriteLine("MMMM dd Format:" + dt.ToString("MMMM dd"));
// 结果
// Date String Current Culture: 6/5/2021
// MM/dd/yyyy Format: 06/05/2021
// dddd, dd MMMM yyyy Format: Saturday, 05 June 2021
// MM/dd/yyyy h:mm tt Format: 06/05/2021 4:58 PM
// MMMM dd Format:June 05

时间format详细介绍

把字符串转成时间

可以使用 Parse()、ParseExact()、TryParse() 和 TryParseExact() 方法将有效的日期和时间字符串转换为 DateTime 对象。

如果指定的字符串不是日期和时间的有效表示,则 Parse() 和 ParseExact() 方法将抛出异常。 因此,建议使用 TryParse() 或 TryParseExact() 方法,因为如果字符串无效,它们将返回 false。

var str = "5/6/2021";
DateTime dt;
            
var isValidDate = DateTime.TryParse(str, out dt);

if(isValidDate)
{
    Console.WriteLine(dt);
}
else
{
    Console.WriteLine($"{str} is not a valid date string");
}

DateTimeOffset

如果我们的系统需要国际化,本地化的话,最好是统一使用Utc时间,最好是用DateTimeOffset,这个结构对时区的处理会更加的简单方便。 而它的方法属性跟DateTime大部分都是类似的。

! DateTime这个东西存储到数据库的时候,如果没有处理好可能会丢失它的时区信息。

上一篇:C# 字符串
最近更新的
...