c# 和sqlserver转换时间 sqlserver的时间戳转换竟然需要+8个小时

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,导致变砖!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值