C# 如何将字符串转换为本地日期时间?

C# 如何将字符串转换为本地日期时间?,c#,.net,parsing,datetime,C#,.net,Parsing,Datetime,我正在尝试转换以下格式的字符串: MM/dd/yyyy HH:mm 输入来自美国数据库,因此,即: 2010年9月20日14:30 我知道我的字符串始终是美国时间,但当我显示它时,我需要将其转换为本地时间,以便字符串应转换为: 09/20/2010 19:30 (for UK for instance) 我尝试了一些方法,但当我在美国机器和英国或Ge机器上运行时,似乎没有什么能给我正确的解决方案 我试过: 它们都在本地(美国机器)工作,但不会在欧洲机器上将时间转换为本地时间 谢谢 Tony更

我正在尝试转换以下格式的字符串:

MM/dd/yyyy HH:mm
输入来自美国数据库,因此,即: 2010年9月20日14:30

我知道我的字符串始终是美国时间,但当我显示它时,我需要将其转换为本地时间,以便字符串应转换为:

09/20/2010 19:30 (for UK for instance)
我尝试了一些方法,但当我在美国机器和英国或Ge机器上运行时,似乎没有什么能给我正确的解决方案 我试过:

它们都在本地(美国机器)工作,但不会在欧洲机器上将时间转换为本地时间

谢谢
Tony

更新:如果您想可靠地将数据转换为其他数据,您必须知道数据的时区(不仅仅是“我们”)以及解释机器。您不仅看到了小时偏移量,还看到了因位置而异的DST(并非所有地区都遵守它)。东部是-4或-5,取决于一年中的时间。如果日期足够长,你就会遇到“夏季”日期最近更改的问题

最好的做法是始终以UTC格式存储时间戳。除此之外,您可以对偏移量进行猜测


如果要转换到其他时区,您应该使用UTC时间(新的、略有不同的GMT版本)

DateTime dt = new DateTime(DateTime.Parse('2010-10-06 19:40').Ticks, DateTimeKind.Local);
dt.AddHours(5);
dt.ToLocalTime();

您还可以使用还包含DST信息的字符串。

您可以使用string.Split。首先在整个字符串上使用“/”分隔符。您将获得“09”“20”和“2010 14:30”,然后再使用“”和“:”应用拆分2次。

除非您另有指定,否则解析将假定您要将字符串解析到当前时区。美国文化只是指字符串的预期格式,与时区无关(例如,在美国,它可以是EST,也可以是PST)

您的字符串不包含时区信息,因此无论本地时区是什么,您都会自然地获得您的值。您可以:


  • 我认为这是一个显示问题,但需要更多的信息来确定。在这两种情况下,请尝试以yyyy-MM-dd格式显示日期,以检查问题是在解析还是在显示上。如果您确切知道要接受或显示的内容,则可以创建自定义格式信息对象:

        public static DateTimeFormatInfo GetISOFormatInfo()
        {
            DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
            dtFormat.DateSeparator = "-";
            dtFormat.TimeSeparator = ":";
            dtFormat.ShortDatePattern = "yyyy-MM-dd";
            dtFormat.ShortTimePattern = "HH:mm:ss";
            return dtFormat;
        }
    

    使用没有时区信息的日期,您将无法知道英国时间/加拿大时间等。。。因为你不知道当时是谁(世界的哪一部分)教的。由于您明确表示时间是美国时间,因此可以添加世界不同地区的时差以显示当地时间

    试试这个-它将本地时间(以美国格式输入)转换为GMT,然后以GB/DE格式打印

    var zones = TimeZoneInfo.GetSystemTimeZones();    // retrieve timezone info
    string value = "09/20/2010 14:30";
    
    DateTime CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm",    
        new CultureInfo("en-US"));
    DateTime FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, 
        TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), 
        TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"));
    string output = FinalDttm.ToString(new CultureInfo("en-GB"));
    
    FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, TimeZoneInfo.Local, 
        TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));
    output = FinalDttm.ToString(new CultureInfo("de-DE"));
    
    反过来,输出是:

    2010年9月20日19:30:00

    20.09.2010 20:30:00


    你测试过DateTime.Parse函数吗?你的计算机是美国机器还是什么?问题出在哪里?在这两种情况下解析的日期都正确吗?这只是显示问题吗?这就是为什么我只使用yyyy-MM-dd格式(虽然从技术上讲,yyyy.MM.dd是最好的,因为它不能被解释为计算或数值)还有,你担心这里的时区吗?我在美国和欧洲也有这台机器。关键是,我需要在CompletedDttm中存储本地时间,而不是字符串中的时间,即美国时间。我得到的时间来自美国数据库。你是说先转换为格林尼治标准时间,然后再转换为当地时间吗?你给出的例子假设他在当地时间有日期……但他没有。他并没有提供很多信息,所以我认为这是他能期待的最好答案。如果我知道我在英国,那就行了,我怎么知道我在哪里?换句话说,我如何查询当地文化?@tony-如果您的时间与美国时区相符,那么您可以将美国文化传递给ParseExact呼叫。上面的代码假设它在美国的一个盒子上运行。对不起,我在美国很难测试你的非美国案例。顺便说一句,我认为存储的日期/时间中缺少信息的其他注释是正确的。如果您无法更改数据库,那么要使所有案例正常工作,这需要做更多的工作。我已经更改了逻辑,假设转换中的输入不是本地的。我认为仍然不是100%可靠,需要按要求处理新的目标时区。@tony;我想TimeZoneInfo只有4种版本。0@Scorpion-MSDN还说.Net 3.5
    var zones = TimeZoneInfo.GetSystemTimeZones();    // retrieve timezone info
    string value = "09/20/2010 14:30";
    
    DateTime CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm",    
        new CultureInfo("en-US"));
    DateTime FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, 
        TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), 
        TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"));
    string output = FinalDttm.ToString(new CultureInfo("en-GB"));
    
    FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, TimeZoneInfo.Local, 
        TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));
    output = FinalDttm.ToString(new CultureInfo("de-DE"));