DateTime dateTimeUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(second);
DateTime dateTimeLocal = dateTimeUtc.ToLocalTime();
这里是没错的,因为格林时间然后toLocaltime()了
sqL server
SELECT DATEADD(second, 1684634911, '19700101 08:00:00')
SELECT DATEADD(second, 1684634911, '19700101 00:00:00')
所以sql时间也可以用这种
CAST('2024-9-21 10:25:23' AS DATETIME)
这样本地插入就不会报错了。
同样是 从0点开始算,但是实际上差了8个小时,和utc时间比差了8个时间差
鉴于sql server的坑,建议这么搞 直接把年月日时分秒转换就不会出现bug了,这种情况主要 需要注意格式化的问题
internal static string timestampInSecond2SQLTime1(long second)
{
//string dateStr = MyUtil.formatTime(MyUtil.timestampInMillisecond2DateTime(second*1000));
DateTime dateTimeUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(second);
DateTime dateTimeLocal = dateTimeUtc.ToLocalTime();
string dateStr = dateTimeLocal.ToString("yyyy-MM-dd HH:mm:ss");
return $"CAST('{dateStr}' AS DATETIME)";
}
SQL Server 默认不会自动检测并应用时区。Unix 时间戳是 UTC 时间,所以 SQL Server 在不进行调整的情况下直接将它解释为本地时间,这就导致了 8 小时的差异
额外话题
纪元时间与时区
格林威治标准时间的,即GMT时间。
但是世界上各个地区有自己的时区,都需要基于GMT时间进行调整。
1970-01-01 08:00:00的显示显然是受到了时区《如何给女朋友解释为什么日本时间比中国快一个小时》的影响,因为中国处于东八区,所以时间会比标准时间早8小时,而标准时间应该是1970-01-01 00:00:00。
应该很多人都记得《苹果"1970 事件"》,在几年前,一个名为vista980622的网友在国外网站Reddit的论坛上发表了一篇“把iPhone时间改成1970年1月1日,手机即可永远变砖”的帖子。
在该帖子发布不久,很多人都不相信,抱着试试看的态度将手机的时间设置成1970年1月1日,结果手机关机后重新开机真的变砖了。
因为我们处于东八区,时间比标准时间要快8小时,如果我们把时间调整成1970-01-01 00:00:00,那么标准时间就会是比这个时间少8小时,即1969年12月31日16时0分0秒。
但是,IOS设备是以UTC时区(GMT时间)的1970年1月1日0点0时0秒为界限,数值为0,用户把时间调整到1969年12月31日16时0分0秒,系统就要出现负值的时间。
系统版本为IOS 8.0至IOS 9.3 beta3,并且搭载64位处理器(即处理器为A7-A9X的设备)的苹果设备都会触发这个Bug,导致变砖!