2009-12-31 59 views
1

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

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

回答

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); 
+1

'ToLocalTime'始终使用本机的当前时区 - 它不会让您指定特定的时区,烦人。幸运的是,.NET 3.5通过'TimeZoneInfo'显着改善了事情。 – 2009-12-31 18:46:17

+0

好点。它也只关注当前的DST调整规则,而不是过去的规则,所以对于过去的日期它可能会导致转换错误。您建议的'TimeZoneInfo.ConvertTime'方法似乎没有失败。 – jball 2009-12-31 18:49:15

3

假设你真的知道涉及两个时区,你可以使用TimeZoneInfo.ConvertTime。如果你不要总是知道涉及的两个时区,当然,你塞满......

存储在其他地方建议的UTC时刻是一个好主意在许多情况下 - 它不起作用当你需要捕捉“每天下午3点”或类似的想法时。

+0

是的,“每天下午3点”是我正在处理的场景的类型。看起来我有两种选择:将日期/时间存储为UTC,并存储客户端的时区,以便其他时区中的客户端可以适当地转换UTC时间;仅存储日期(该日期的午夜),然后存储日期/时间应该表示为db中单独项目的午夜小时数/分钟数。合理? – 2009-12-31 19:32:16

+0

@泰德:是的,绝对。当Noda Time(http://code.google.com/p/noda-time)完成时,这应该对你更容易一些:)如果你提供更多关于* exact *情况的细节,我可以建议进一步来说。 – 2009-12-31 20:11:52

相关问题