Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Framework 2.0中使用夏令时_C#_Datetime_Timezone_Dst - Fatal编程技术网

C# 如何在Framework 2.0中使用夏令时

C# 如何在Framework 2.0中使用夏令时,c#,datetime,timezone,dst,C#,Datetime,Timezone,Dst,我正在开发一个windows服务应用程序,一旦我的应用程序服务器在一个时区运行,db服务器(实际上是一个web服务)在另一个时区运行,我就需要使用夏令时 每次在数据库中记录新数据时,都会使用当前的本地日期时间,这与我的应用程序服务器的datetime不同,因此,当我需要在db中查找结果时,我需要增加/减少datetime的偏移量,以找到正确的日期时间,但是,当夏令时更改时,我会遇到问题,因为我需要手动改变这个偏移量,这导致了一系列问题,因为我们必须有人监控系统 我不想使用任何其他工具、网站等来获

我正在开发一个windows服务应用程序,一旦我的应用程序服务器在一个时区运行,db服务器(实际上是一个web服务)在另一个时区运行,我就需要使用夏令时

每次在数据库中记录新数据时,都会使用当前的本地日期时间,这与我的应用程序服务器的datetime不同,因此,当我需要在db中查找结果时,我需要增加/减少datetime的偏移量,以找到正确的日期时间,但是,当夏令时更改时,我会遇到问题,因为我需要手动改变这个偏移量,这导致了一系列问题,因为我们必须有人监控系统

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


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

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

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

或者您可以创建LocaizedDateTime

========

更新:
我已经使用windows注册表获取偏移量很长时间了。所有区域设置都存储在那里,并带有未来几年的偏移量。当您应用service Pack等时,此数据会自动更新


是一个链接,详细说明了在windows注册表(circa.net 2.0)中包装区域设置信息的旧方法的实现。

如果您只需要使用运行.net代码的计算机的本地时区,则可以使用,该时区自1.1版起一直在.net中

然而,我想你是在询问与当地时区以外的其他时区合作的问题。这是通过.NET 3.5及更高版本中的
TimeZoneInfo
处理的,但不适用于.NET 2.0应用程序

在.NET 2.0应用程序中处理多个时区的最佳解决方案(IMHO)是。它正确地执行,并且多年来一直保持着。然而,它是一个第三方库,你说你不希望使用任何不是源于微软的东西


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

听起来让数据库在输入时间存储可能会解决您的问题。我同意@DanJ的观点,将您的所有时间存储在zulu tim e(UTC)中通常是一个很好的做法并允许任何本地客户端在向最终用户演示内容时进行转换。您是否绝对限于.Net 2.0?你能用3.5吗?如果不允许,你可以使用开源库吗?这段代码有点疯狂,没有什么用处。您知道
DateTime.SpecifyKind
不会更改值,对吗?为什么您会选择UTC值并将其指定为本地种类?那太荒谬了,马特,你说得对。我在错误的道具上指定了那种。。我已经更新了代码。好吧,我知道你现在在做什么,但我不确定这是如何解决OP的问题的。旁白——你看到了吗?它需要.net 3.5,但我想您可能会发现它的类型比您的
LocalizedDateTime
类更有用。这是一个使用UTC维护本地化值的对象,假定UTC值保存在db中。从数据库获取数据时,使用FromUtc进行实例化;在应用程序中生成要存储在数据库中的日期时间时,使用FromLocal进行实例化。根据需要使用UtcDateTime或LocalDateTime道具。例如,在保存到db用户UtcDateTime时,在设置日历时使用LocalDateTime。其思想是使用utc值或本地值进行实例化,您可以使用本地值和utc值。这可以进一步扩展到像datetime这样的操作。我明白了,但是OP询问使用其他时区。他想要类似于TimeZoneInfo的东西,但是来自.NET2.0。您的代码仅适用于本地时区。所以,虽然我理解你的意思,但它并没有解决张贴在这里的问题。
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));
    }
}