我正在尝试转换此格式的字符串:
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"));
他们都在本地工作(美国机器),但他们没有将时间转换为欧洲机器上的当地时间。
由于 贝
答案 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)。
您的字符串不包含时区信息,因此您自然会在当地时区获得您的价值。你可以:
答案 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”,然后用''和':'
再分两次