0

我正在开发一个 Windows 服务应用程序,我需要使用夏令时,一旦我的应用服务器在一个时区运行并且数据库服务器(实际上是一个 Web 服务)在另一个时区运行。

每次在数据库中记录新数据时,它都使用当前本地日期时间,这与我的应用服务器的日期时间不同,因此,当我需要在数据库中查找结果时,我需要增加/减少偏移量使用正确的日期时间来查找日期时间,但是,当夏令时更改时,我遇到了麻烦,因为我需要手动更改此偏移量,并且由于我们必须有人监视系统,因此会引起很多问题。

我不想使用任何其他工具、网站等来获取这些信息,我们只需要使用 Microsoft 的东西。

我一直在寻找在 .NET 2.0 上使用 TimeZones 的方法,但我没有找到任何东西,我的问题是,这里有人遇到过这样的情况吗?

4

3 回答 3

1

我一直在使用 windows 注册表来获取偏移量。所有语言环境都存储在那里,并带有未来几年的偏移量。当您应用服务包等时,此数据会自动更新。

是一个链接,详细介绍了在 Windows 注册表中包装语言环境信息的旧方法的实现 - circa .net 2.0。

于 2013-11-04T17:27:05.390 回答
0

如果您只需要使用运行 .NET 代码的机器的本地时区,那么您可以使用自 1.1 版以来一直在 .NET 中TimeZone类。

但是,我认为您是在询问是否使用本地时区以外的其他时区。这TimeZoneInfo在 .NET 3.5 及更高版本中处理,但不适用于 .NET 2.0 应用程序。

在 .NET 2.0 应用程序中处理多个时区的最佳解决方案(恕我直言)是TZ4NET 库。它正确地实现了 IANA 时区数据库,并且多年来一直在维护。但是,它是一个第三方库,您说您不希望使用任何不是来自 Microsoft 的东西。

不幸的是,剩下的唯一选择是手动从 Windows 注册表中读取时区数据并实现您自己的代码来解释它。这里有一篇很好的博客文章,描述了如何TimeZoneInfo从注册表中读取,并描述了所涉及的注册表项和数据。一个完整的实现对于这篇文章来说太宽泛了。

于 2014-07-10T17:32:54.330 回答
0

最好使用 UTC 值存储在数据库中并转换为本地或应用程序中的任何其他 TimeZone

DateTime.Now.ToUniversalTime() DateTime.SpecifyKind(dt, DateTimeKind.Local);

http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx

或者您可以创建 LocalaizedDateTime

========

更新:

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));
    }
}
于 2013-11-04T17:22:22.110 回答