造好的轮子
不在生成时间戳时进行时区偏移:
//生成时间戳字符串,等同于 DateTimeOffset.UtcNow.ToUnixTimeSeconds()
var date= DateTimeOffset.Now.ToUnixTimeSeconds().ToString();
//记录本地时区偏移
var offset=DateTimeOffset.Now.Offset;
//时间戳转DateTime并增加时区偏移获取对应本地时间
var dateTime= DateTimeOffset.FromUnixTimeSeconds(long.Parse(date)).DateTime.AddHours(offset.Hours);
直接在生成时间戳时进行时区偏移:
//生成当前本地时间戳字符串
var date= DateTimeOffset.Now.AddHours(DateTimeOffset.Now.Offset.Hours).ToUnixTimeSeconds().ToString();
//时间戳字符串转DateTime
var dateTime= DateTimeOffset.FromUnixTimeSeconds(long.Parse(date)).DateTime;
使用场景建议
有大量需要进行当前时间记录的场景;
设计思路:
生成时间戳字符串:
通过DateTimeOffset.ToUnixTimeSeconds函数获取自1970-01-01T00:00:00Z (1970 年1 月1 日上午12:00 UTC) 以来所经过的Unix 时间(以秒数表示);得到10位数左右的long值,将其转换为字符串进行通信或保存;
因为生成固定为国际时间的时间戳,所以本地时间需要进行时区偏移;
时间戳转换为DateTime:
通过DateTimeOffset.FromUnixTimeSeconds函数进行反向转换获取时间偏移值,并直接获取DateTime属性;若生成时未进行时间偏移,需要获取本地时间则进行时间偏移;
相关零件
DateTime.Now:当前本地时间;
DateTime.UtcNow:当前国际时间;
DateTimeOffset.Now:当前本地时间偏移;
DateTimeOffset.UtcNow当前国际时间偏移;
DateTimeOffset.Now.Offset:当前时间相较于国际时间的偏移(时区)
TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo):将时间偏移转换成特定时区时间