如何在框架 2.0 中使用夏令时



我正在开发一个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如何从注册表读取,并描述了所涉及的注册表项和数据。 对于这篇文章来说,完整的实现太宽泛了。

相关内容

  • 没有找到相关文章

最新更新