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

时间:2010-10-06 14:03:13

标签: c# .net parsing datetime

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

MM/dd/yyyy HH:mm

输入来自美国数据库,因此,即: 09/20/2010 14:30

我知道我的字符串总是在美国时间,但是当我显示它时,我需要将其转换为当地时间,以便字符串应该变成:

09/20/2010 19:30 (for UK for instance)

我尝试了一些东西,但是当我在美国机器上运行与英国或Ge机器相比时似乎没有任何东西给我正确的解决方案 我试过了:

CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", CultureInfo.CurrentCulture);
CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", new CultureInfo("en-US"));

他们都在本地工作(美国机器),但他们没有将时间转换为欧洲机器上的当地时间。

由于 贝

6 个答案:

答案 0 :(得分:4)

更新:如果您想要可靠地转换,您必须知道数据的时区(不仅仅是“US”)以及解释机器它到别的什么。您不仅要查看小时偏移量,而且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();

您也可以使用TimeZoneInfo来获取DST信息。

答案 1 :(得分:3)

除非您另行指定,否则解析将假定您将字符串解析为当前时区。美国文化仅仅意味着字符串的预期格式,与时区无关(例如,在美国它可能是EST,也可能是PST)。

您的字符串不包含时区信息,因此您自然会在当地时区获得您的价值。你可以:

  1. Add the timezone info
  2. Change the timezone afterwards

答案 2 :(得分:3)

试试这个 - 它将当地时间(以美国格式输入)转换为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"));

依次输出:

  

20/09/2010 19:30:00

     

20.09.2010 20:30:00

答案 3 :(得分:0)

我认为这是一个显示问题,但需要更多信息才能确定。尝试在两种情况下以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;
    }

答案 4 :(得分:0)

使用没有TimeZone信息的日期,您将无法知道英国时间/加拿大时间等...因为您不知道谁(世界的哪个部分)在那个时间输入了。由于您特别说时间是美国时间,您可以添加世界不同地区的时差来显示当地时间。

答案 5 :(得分:-2)

你可以使用string.Split。首先在整个字符串上使用'/'分隔符。你会得到“09”“20”和“2010 14:30”,然后用''和':'

再分两次