希望您能理解并帮助我。
My Sql Server is in South Africa(GMT+2)
My Application is in USA (GMT-6)
我的客户(手机)曾经在南非,现在在巴西(GMT-4)。
表中记录的LastUpdateTime
应该是10:25am,而客户端时间是4:25am。此时,服务器指示2:25am(或类似的时间)
我教我可以使用GETUTCDATE
函数在sql现在插入。但我的问题是:
-
我如何将所有旧记录的
LastUpdateTime
自动转换为UTC DATE ? -
这个转换是一个好主意还是我可以在应用程序中做?
-
我如何允许配置服务器时区在我的
web.config
文件appSetting
节(这是为了提到它每次服务器时区的变化)?
有两种不同的方式可以接受存储像LastUpdateTime
这样的值:
- 对于UTC,在
datetime
或datetime2
字段中 - 表示本地时间,在
datetimeoffset
字段
如果您将本地时间存储在datetime
字段中,那么该值可能是不明确的。转换为UTC将需要外部知识如何捕获原始数据。
如果这些值是由SQL的GETDATE
语句捕获的,那么SQL Server的时区是相关的。南非的时间一直是UTC+02:00,所以您可以:
- 保持相同字段的值并减去两个小时以调整为UTC
-
或,将值复制到
datetimeoffset
字段,保留原始值并使用UTC+02:00偏移量。
但是,如果该值是在另一个时区获得的,那么您需要知道该时区是哪个时区。你也可能会遇到夏令时的问题,因为许多时区并没有固定到一个偏移量。
你说应用程序是在美国GMT-6,但这没有意义。美国的中部时间在UTC-06:00和UTC-05:00之间交替,而美国的山地时间在UTC-07:00和UTC-06:00之间交替。你需要知道它是哪个时区,然后你必须为可能的重叠做好准备,因为夏时制转换的回落。
关于是否到web。配置文件-这更像是一个ASP。Net问题,而不是SQL Server问题。但是,我现在可以告诉您,没有神奇的配置设置可以做到这一点。您的应用程序必须正确地使用DateTime
和DateTimeKind.Utc
,或者使用DateTimeOffset
,您可能需要使用TimeZoneInfo
来进行转换。这里不可能提供更好的建议,因为您没有展示任何代码,而且这是一个非常广泛的主题。