我需要在CST时区存储日期时间,无论给出任何时区。
访问该应用程序的客户来自不同的时区,如IST,CST,EST,......
我需要将客户端在CST时区中输入的所有日期时间存储到我的数据库中。在检索时,我需要转换回当地时区。
如何实现它?
答案 0 :(得分:2)
这样的事情最有可能为你效劳。我可能有一个不正确的时区ID值,但我认为这很接近。时区的东西可以在.NET 3.5 +
中找到DateTime clientDateTime = DateTime.Now;
DateTime centralDateTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(clientDateTime, "Central Time (US & Canada)");
编辑:
如果您可以通过检测客户端时区来存储DateTime,只要它们为您提供最佳选项的日期。然后,根据客户端时区,您可以根据客户端的本地时区呈现日期。
答案 1 :(得分:2)
通常接受以GMT / UTC格式在数据库中存储所有日期时间值。
对于那些想要为应用程序的不同用户将UTC值呈现给特定时区的人,如wilpeck提到的,建议您确定最终用户的区域设置,并且:
修改强>
例如:
您可能有一个包含字段 StartDateTime 的表格,因此要支持多个时区,您可能需要一个额外字段 StartDateTimeOffset 。如果客户端位于印度标准时间(IST)区域,您的日期时间值可能为2009/10/13 14:45,即UTC的2009/10/13 09:15。因此,您将UTC值(2009/10/13 09:15)存储在 StartDateTime 字段中,并将偏移量+05:30存储在 StartDateTimeOffset 字段中。现在,当您从数据库中读回此值时,您可以使用偏移量将UTC日期时间值(2009/10/13 09:15)转换回2009/10/13 14:45的当地时间。
答案 2 :(得分:0)
尝试这样。
DateTime clientDateTime = DateTime.Now;
DateTime centralDateTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(clientDateTime, "Central Standard Time");
时区ID
DateTime currentTime = DateTime.Now;
Console.WriteLine("Current Times:");
Console.WriteLine();
Console.WriteLine("Los Angeles: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "Pacific Standard Time"));
Console.WriteLine("Chicago: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "Central Standard Time"));
Console.WriteLine("New York: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "Eastern Standard Time"));
Console.WriteLine("London: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "GMT Standard Time"));
Console.WriteLine("Moscow: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "Russian Standard Time"));
Console.WriteLine("New Delhi: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "India Standard Time"));
Console.WriteLine("Beijing: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "China Standard Time"));
Console.WriteLine("Tokyo: {0}",
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(currentTime, TimeZoneInfo.Local.Id, "Tokyo Standard Time"));