我希望你能理解并帮助我。
我的Sql Server在南非(GMT + 2)
我的申请是在美国(GMT-6)
我的客户(移动)在南非,现在在巴西(GMT-4)。
表中记录的LastUpdateTime
应该是上午10:25,而客户时间是凌晨4:25。此时服务器指示凌晨2:25(或类似的东西)
我教过我可以在sql中使用GETUTCDATE
函数进行插入。但我的问题是:
如何自动将所有旧记录“LastUpdateTime
转换为UTC日期?
这个转换是个好主意,还是我可以在应用程序中进行?
如何在web.config
文件appSetting
部分中允许配置服务器时区(这是为了在每次服务器时区更改时提及)?
答案 0 :(得分:3)
有两种不同的方式可以存储像LastUpdateTime
这样的值:
datetime
或datetime2
字段datetimeoffset
字段如果您已将当地时间存储在datetime
字段中,则该值可能不明确。转换为UTC将需要外部了解原始数据的捕获方式。
如果SQL的GETDATE
语句捕获了这些值,则SQL Server的时区是相关的。南非的时间总是UTC + 02:00,所以你可以:
datetimeoffset
字段,保留orignal值并使用UTC + 02:00偏移。但是,如果该值是在另一个时区获得的,那么您需要知道该时区。您可能还遇到夏令时问题,因为许多时区未固定为单个偏移。
你说申请是在美国GMT-6,但这没有意义。美国的中部时间在UTC-06:00和UTC-05:00之间交替,而美国的Mountain Time在UTC-07:00和UTC-06:00之间交替。您需要知道它是哪个时区,然后由于fall-back daylight saving time transition,您必须为潜在的重叠做好准备。
关于是否对web.config文件 - 这更像是一个ASP.Net问题,而不是一个SQL Server问题。但是,我现在可以告诉你,没有神奇的配置设置来做到这一点。您的应用必须使用DateTime
正确使用DateTimeKind.Utc
,或使用DateTimeOffset
,您可能需要TimeZoneInfo
进行转换。在这里提供更好的建议是不可能的,因为你没有展示任何代码,这是一个非常广泛的主题。