如何通过不同的时区移动本地DateTime值

时间:2009-12-31 18:40:24

标签: c# .net datetime

存储/检索由具有特定本地日期和时间的应用程序创建的DateTime值的最佳方法是什么,存储在可能位于不同时区的服务器上的数据库中,然后由其他设备检索在不同的时区,这些设备需要使用与最初输入的相同的本地时间来解释DateTime值?例如,PST时区中的用户创建一个应该在1月1日上午8:00发生的事件;该事件的日期时间存储在服务器上;然后,EST时区中的用户检索DateTime,并将事件解释为在1/1/10上午8:00发生,而不是在上午11:00发生。

当前实现使用本地时区创建DateTime,但是当使用Windows服务将DateTime上载到服务器时,DateTime会在存储到数据库之前转换为服务器的本地时区。

3 个答案:

答案 0 :(得分:3)

假设您确实知道所涉及的两个时区,则可以使用TimeZoneInfo.ConvertTime。如果你总是知道所涉及的两个时区,当然,你已经塞满了......

按照其他地方的建议将UTC存储在其他地方是一个好主意 - 当你需要捕捉“每天下午3点”或类似的东西时它不起作用。

答案 1 :(得分:2)

将它们转换为UTC并传递它们。如果您也需要创作者的时区,您也必须存储该信息。您可以在.NET中使用DateTimeOffset structure,在SQL Server中使用datetimeoffset data type

答案 2 :(得分:1)

将它们全部存储为通用时间,并在视图中转换为本地时区。您会发现ToUniversalTimeToLocalTime很有帮助。 以下是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);