所以我不确定使用哪一个,因为我对两者的理解都有限。我遇到的问题是我想根据用户在他们的机器上将时钟设置为哪个时区来显示时间。例如,如果用户将他们的机器设置为 EST 但在加利福尼亚,我希望时间以 EST 显示。我应该使用 toUniversalTime() 和 ToLocalTime() 吗?
ChangeDate = DBNulls.DBNullToDateTime(reader[ChangeDateOrdinal]).ToUniversalTime()?
ChangeDate = DBNulls.DBNullToDateTime(reader[ChangeDateOrdinal]).ToLocalTime()?
最佳答案
在那种情况下,您可以使用 ToLocalTime()
... 但只有当数据库中的值已经采用 UTC 时,这才有效。如果它在其他时区,那就完全不同了:)
在许多(但不是所有)情况下,将 UTC 存储在数据库中是正确的方法。因此,当您接受用户输入时,您可能希望将其转换为 UTC 并存储 UTC 值...然后当您使用 ToLocalTime()
将值返回给用户(可能是不同时区的不同用户)将使用该查看用户的时区。
机器的物理位置无关紧要 - 重要的是系统时区。
现在,如果您正在编写一个 Web 应用程序,因此用户的时区不是运行 .NET 代码的机器的时区,这又是一个不同的问题 - 那么您可以将 UTC 发送回客户端并获取 Javascript 将其转换为本地时间,或检测用户的时区(再次使用 Javascript)并在服务器上执行转换,可能使用 TimeZoneInfo
。
Plug:如果你愿意离开 BCL 类(class),你可能会发现我的 Noda Time图书馆有助于让事情更清晰。对于您可能想要使用的所有不同类型的值,它具有不同的类型,并且支持由 IANA 维护的最常见的时区数据库,如果您正在检测客户端时区,这可能会有所帮助。
关于c# - ToUniversalTime() 和 ToLocalTime() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34907825/