我正在开发一个Windows服务应用程序,一旦我的应用程序服务器在一个时区运行,数据库服务器(实际上是Web服务)在另一个时区运行,我需要使用夏令时。
每次在数据库中记录新数据时,它都会使用当前的本地日期时间,这与我的应用程序服务器的日期时间不同,因此,当我需要在 db 上查找结果时,我需要增加/减少日期时间的偏移量以使用正确的日期时间进行查找,但是,当夏令时更改时,我遇到了麻烦, 因为我需要手动更改此偏移量,并且由于我们必须有人监视系统,因此会导致一系列问题。
我不想使用任何其他工具、网站等来获取这些信息,我们只需要使用Microsoft的东西。
我一直在寻找在.NET 2.0上使用时区的方法,但我什么也没找到,我的问题是,这里有人遇到过这样的情况吗?
很长一段时间以来,我一直在使用 Windows 注册表来获取偏移量。所有区域设置都存储在那里,并带有未来几年的偏移量。当您应用服务包等时,此数据会自动更新。
这是一个链接,详细介绍了将区域设置信息包装在 Windows 注册表中的旧方法的实现 - 大约 .net 2.0 .
最好使用 UTC 值存储在数据库中并在应用程序中转换为本地或任何其他时区
DateTime.Now.ToUniversalTime()DateTime.SpecifyKind(dt, DateTimeKind.Local);
http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx
或者您可以创建定位日期时间
========
更新:
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));
}
}
如果只需要使用运行 .NET 代码的计算机的本地时区,则可以使用 TimeZone
类,该类自版本 1.1 以来一直在 .NET 中。
但是,我认为您是在询问使用本地时区以外的其他时区。 这在 .NET 3.5 及更高版本中使用 TimeZoneInfo
处理,但不适用于 .NET 2.0 应用程序。
在 .NET 2.0 应用程序中 处理多个时区的最佳解决方案(恕我直言)是 TZ4NET 库。 它正确实施了 IANA 时区数据库,并且多年来一直得到维护。 但是,它是一个第三方库,您说您不希望使用任何不是源自Microsoft的东西。
不幸的是,剩下的唯一选择是从Windows注册表中手动读取时区数据,并实现自己的代码来解释它。 这里有一篇很好的博客文章,描述了TimeZoneInfo
如何从注册表读取,并描述了所涉及的注册表项和数据。 对于这篇文章来说,完整的实现太宽泛了。