我正在开发一个Windows服务应用程序,我需要使用夏令时,一旦我的app服务器在一个时区运行,而db服务器(实际上是一个Web服务)在另一个时区运行。
每次在数据库中记录新数据时,都会使用当前的本地日期时间,这与我的应用服务器的日期时间不同,因此,当我需要在db中查找结果时,我需要增加/减少使用正确的日期时间找到日期时间的偏移量,但是,当夏令时发生变化时,我遇到了麻烦,因为我需要手动更改此偏移量,并且由于我们必须让某人监视系统而导致一系列问题。
我不想使用任何其他工具,网站等来获取此信息,我们只需要使用Microsoft的东西。
我一直在寻找在.NET 2.0上使用TimeZones的方法,但我没有找到任何东西,我的问题是,这里有人遇到过这样的情况吗?
答案 0 :(得分:1)
我一直在使用Windows注册表来获取偏移很长一段时间。所有区域设置都存储在那里,以及未来几年的偏移量。当您应用Service Pack等时,这些数据会自动更新。
Here是一个链接,详细说明了在Windows注册表中包装区域设置信息的旧方法的实现 - 大约.net 2.0。
答案 1 :(得分:0)
最好使用UTC值存储在数据库中并转换为应用程序中的本地或任何其他TimeZone
DateTime.Now.ToUniversalTime() DateTime.SpecifyKind(dt,DateTimeKind.Local);
http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx
或者您可以创建LocaizedDateTime
======
using System;
using System.Collections.Generic;
public class MyClass
{
public static void RunSnippet()
{
LocalizedDateTime dt = LocalizedDateTime.FromUtc(DateTime.UtcNow);
Console.WriteLine(dt.LocalDateTime.ToString("dd/MM/yyyy hhmmss"));
Console.WriteLine(dt.UtcDateTime.ToString("dd/MM/yyyy hhmmss"));
}
#region Helper methods
public static void Main()
{
try
{
RunSnippet();
}
catch (Exception e)
{
string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
Console.WriteLine(error);
}
finally
{
Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
public class LocalizedDateTime
{
private LocalizedDateTime(DateTime localDateTime)
{
LocalDateTime = DateTime.SpecifyKind(localDateTime, DateTimeKind.Local);
}
public DateTime UtcDateTime{
get{
return LocalDateTime.ToUniversalTime();
}
}
public DateTime LocalDateTime{get; private set;}
public static LocalizedDateTime FromLocal(DateTime localDateTime)
{
return new LocalizedDateTime(localDateTime);
}
public static LocalizedDateTime FromUtc(DateTime utcDateTime)
{
return new LocalizedDateTime(TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, TimeZoneInfo.Local));
}
}
答案 2 :(得分:0)
如果您只需要使用运行.NET代码的计算机的本地时区,那么您可以使用自{1.1版以来一直在.NET中的the TimeZone
class。
但是,我认为您要求使用其他时区而不是本地时区。这在.NET 3.5及更高版本中使用TimeZoneInfo
处理,但不适用于.NET 2.0应用程序。
在.NET 2.0应用程序 中处理多个时区 的最佳解决方案(IMHO)是TZ4NET Library。它正确地实现了the IANA time zone database,并且多年来一直保持着。但是,它是第三方库,您说您不希望使用任何不是源自Microsoft的东西。
不幸的是,剩下的唯一选择是手动从Windows注册表中读取时区数据并实现自己的代码来解释它。有一个good blog post here描述了TimeZoneInfo
如何从注册表中读取,并描述了所涉及的注册表项和数据。对于这篇文章,完整的实现过于宽泛。