C#MVC中的GMT时间匹配无法正常工作。
获取时差的问题不正确。
以下是我尝试但无法使用的代码:
DateTime newDateTime = Convert.ToDateTime(DateNw).Add(TimeSpan.Parse(Time));
////New Zealand
string nzTimeZoneKey = Country + " Standard Time";
string date = newDateTime.ToUniversalTime().ToString("u");
DateTime localDateTime = DateTime.Parse(date);
DateTime utcDateTime = localDateTime.ToUniversalTime();
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
return nzDateTime;
上述为印度和阿富汗工作的代码运作良好,但如果我改变印度和斐济之间的国家,它就无法正常工作。
我希望GMT时间匹配所有可以区分两个国家/地区时间的国家/地区。 有什么建议吗?
答案 0 :(得分:2)
您需要在注册表中查找要在TimeZoneInfo
转化中使用的相应时区名称作为国家/地区+"标准时间"不要总是工作。
密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
包含所有支持的时区的名称。请注意,微软最近发布了斐济最近更改其DST的信息。
你是否过于复杂?
string date = newDateTime.ToUniversalTime().ToString("u");
DateTime localDateTime = DateTime.Parse(date);
看看是否有效...如果DateTime
以UTC格式存储,您可以使用我在下面的静态类中添加的一些函数。
DateTime utcDateTime=ReadeFromDatabaseAsUTC();
TimeZoneInfo localTimeZoneInfo=new TimeZoneInfo("New Zealand Standard Time");
DateTime localDateTime= TimeZoneConversion.FromUTCToSpecificTimeZone(localTimeZoneInfo,utcDateTime);
localDateTime=localDateTime.Add(TimeSpan.Parse(Time));
utcDateTime=TimeZoneConversion.FromSpecificTimeZoneToUTC(localTimeZoneInfo,localDateTime);
SaveToDatabaseAsUTC(utcDateTime);
这是一个方便的课程,您可以用它来帮助转换:
public static class TimeZoneConversion
{
public static System.DateTime FromSpecificTimeZoneToUTC(string specificZone, System.DateTime specificTimeZoneDateTime)
{
TimeZoneInfo fromZone = TimeZoneInfo.FindSystemTimeZoneById(specificZone);
return TimeZoneInfo.ConvertTimeToUtc(specificTimeZoneDateTime, fromZone);
}
//--------------------------------------------------------------------------------------------
public static System.DateTime FromSpecificTimeZoneToUTC(TimeZoneInfo fromZone, System.DateTime specificTimeZoneDateTime)
{
System.DateTime temp = System.DateTime.SpecifyKind(specificTimeZoneDateTime, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(temp, fromZone);
}
//--------------------------------------------------------------------------------------------
public static System.DateTime FromUTCToSpecificTimeZone(TimeZoneInfo toZone, System.DateTime UTCTimeZoneDateTime)
{
return TimeZoneInfo.ConvertTimeFromUtc(UTCTimeZoneDateTime, toZone);
}
//--------------------------------------------------------------------------------------------
public static TimeSpan GetTimeZoneOffsetDifference(TimeZoneInfo oldZone, TimeZoneInfo newZone)
{
var now = DateTimeOffset.UtcNow;
TimeSpan oldOffset = oldZone.GetUtcOffset(now);
TimeSpan newOffset = newZone.GetUtcOffset(now);
TimeSpan difference = oldOffset - newOffset;
return difference;
}
//--------------------------------------------------------------------------------------------
public static System.DateTime FromUTCToSpecificTimeZone(string totimezone, System.DateTime UTCTimeZoneDateTime)
{
TimeZoneInfo toZone = TimeZoneInfo.FindSystemTimeZoneById(totimezone);
return TimeZoneInfo.ConvertTimeFromUtc(UTCTimeZoneDateTime, toZone);
}
//--------------------------------------------------------------------------------------------
public static System.DateTime FromLocalTimeZoneToUTC(System.DateTime localDateTime)
{
return localDateTime.ToUniversalTime();
}
//--------------------------------------------------------------------------------------------
public static string GetServerTimeZoneID()
{
return TimeZone localZone = TimeZone.CurrentTimeZone.StandardName;
}
//--------------------------------------------------------------------------------------------
}
答案 1 :(得分:1)
我建议您根据时区设置每个时间,而不是更改国家/地区:
var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
为每个人做这个不行吗? 没有必要直接连接每个。
答案 2 :(得分:1)
您应该使用标准时区,而不是尝试根据国家/地区名称创建一个时区。
ReadOnlyCollection<TimeZoneInfo> tzCollection;
tzCollection = TimeZoneInfo.GetSystemTimeZones();
Console.WriteLine(tzCollection.Count);
foreach (TimeZoneInfo timeZone in tzCollection)
{
Console.WriteLine("{0} : {1} : {2}", timeZone.Id, timeZone.DisplayName, timeZone.BaseUtcOffset.TotalMinutes);
}
此时区集合可以绑定到列表或下拉列表。您可以使用DisplayName向用户显示名称,使用Id作为绑定到列表中每个项目的值。当用户选择时区时,您可以使用其ID来从集合中找到时区。
var selectedTimezone = DropDownList1.SelectedItem.Value;
TimeZoneInfo.FindSystemTimeZoneById(selectedTimeZone);
一旦掌握了时间信息,您就可以继续使用转换逻辑和其他内容。