存储/检索由具有特定本地日期和时间的应用程序创建的DateTime值的最佳方法是什么,存储在可能位于不同时区的服务器上的数据库中,然后由其他设备检索在不同的时区,这些设备需要使用与最初输入的相同的本地时间来解释DateTime值?例如,PST时区中的用户创建一个应该在1月1日上午8:00发生的事件;该事件的日期时间存储在服务器上;然后,EST时区中的用户检索DateTime,并将事件解释为在1/1/10上午8:00发生,而不是在上午11:00发生。
当前实现使用本地时区创建DateTime,但是当使用Windows服务将DateTime上载到服务器时,DateTime会在存储到数据库之前转换为服务器的本地时区。
答案 0 :(得分:3)
假设您确实知道所涉及的两个时区,则可以使用TimeZoneInfo.ConvertTime
。如果你不总是知道所涉及的两个时区,当然,你已经塞满了......
按照其他地方的建议将UTC存储在其他地方是一个好主意 - 当你需要捕捉“每天下午3点”或类似的东西时它不起作用。
答案 1 :(得分:2)
将它们转换为UTC并传递它们。如果您也需要创作者的时区,您也必须存储该信息。您可以在.NET中使用DateTimeOffset
structure,在SQL Server中使用datetimeoffset
data type。
答案 2 :(得分:1)
将它们全部存储为通用时间,并在视图中转换为本地时区。您会发现ToUniversalTime和ToLocalTime很有帮助。 以下是MSDN的示例代码:
System.Console.WriteLine("Enter a date and time.");
string strDateTime = System.Console.ReadLine();
System.DateTime localDateTime;
try {
localDateTime = System.DateTime.Parse(strDateTime);
}
catch (System.FormatException) {
System.Console.WriteLine("Invalid format.");
return;
}
System.DateTime univDateTime = localDateTime.ToUniversalTime();
System.Console.WriteLine("{0} local time is {1} universal time.",
localDateTime,
univDateTime);
System.Console.WriteLine("Enter a date and time in universal time.");
strDateTime = System.Console.ReadLine();
try {
univDateTime = System.DateTime.Parse(strDateTime);
}
catch (System.FormatException) {
System.Console.WriteLine("Invalid format.");
return;
}
localDateTime = univDateTime.ToLocalTime();
System.Console.WriteLine("{0} universal time is {1} local time.",
univDateTime,
localDateTime);