2014-03-27 56 views
1

下面是我使用发生在三个输入的方法,包括:使用的TimeZoneInfo来调整时区的夏令偏移

dateTimeInput其是表示日期的字符串。

inputFormat是我的format这样的字符串:yyyy-MM-dd'T'HH:mm:sszzz

timeZoneStandardName是从var TimeZoneList = TimeZoneInfo.GetSystemTimeZones();检索到的唯一的时区标识符,其中的ID是通过timeZoneList.Id检索的。

我主要使用TimeZoneInfo来获得我的小时和分钟偏移量,因为它对于什么城市/时区非常明确,例如, UTC是输入字符串。

public int dateTimeToUnixTime(string dateTimeInput, string inputFormat, string timeZoneStandardName) 
{ 
    DateTime result; 
    CultureInfo provider = CultureInfo.InvariantCulture; 
    TimeZoneInfo objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneStandardName); 
    int timeZoneHours = objTimeZoneInfo.BaseUtcOffset.Hours; 
    int timeZoneMinutes = objTimeZoneInfo.BaseUtcOffset.Minutes; 

    // if input format is "yyyy-MM-dd'T'HH:mm:sszzz" 
    if (inputFormat == "yyyy-MM-dd'T'HH:mm:sszzz") 
    { 
     result = DateTime.ParseExact(dateTimeInput, inputFormat, provider, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); 
     int unixTime = (Int32)(result.Subtract(Epoch)).TotalSeconds; 
     return unixTime; 
    } 
    else 
    { 
     // if other input formats 
     result = DateTime.ParseExact(dateTimeInput, inputFormat, provider, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); 
     int unixTime = (Int32)(result.AddHours(-timeZoneHours).AddMinutes(-timeZoneMinutes).Subtract(Epoch)).TotalSeconds; 
     return unixTime; 
    } 
} 

我的第二个方法需要在一个Unix时间戳和时区指定器和输出作为依赖于位置的时间:

public string unixTimeToDateTime(int unixInput, string outputFormat, string timeZoneStandardName) 
{ 
    // output format is "yyyy-MM-dd'T'HH:mm:sszzz" 
    TimeZoneInfo objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneStandardName); 
    int timeZoneHours = objTimeZoneInfo.BaseUtcOffset.Hours; 
    int timeZoneMinutes = objTimeZoneInfo.BaseUtcOffset.Minutes; 
    if (outputFormat == "yyyy-MM-dd'T'HH:mm:sszzz") 
    { 
     System.DateTime dateTime = Epoch.AddSeconds(unixInput); 
     return dateTime.AddHours(timeZoneHours).AddMinutes(timeZoneMinutes).ToString("yyyy-MM-dd'T'HH:mm:ss") + toTimeSpan(timeZoneHours, timeZoneMinutes); 
    } 
    // output format is not 
    else 
    { 
     System.DateTime dateTime = Epoch.AddSeconds(unixInput).AddHours(timeZoneHours).AddMinutes(timeZoneMinutes); 
     return dateTime.ToString(outputFormat); 
    } 
} 

例如,下面是该方法在蚱蜢部件为我显示你是什​​么意思。 dateTimeToUnixTime()是我的第一个“时钟”,而unixTimeToDateTime()是我的第二个“时钟”

enter image description here

鉴于时间的列表和EST的时区标志的输入,并给予这些日期(请注意2014年11月2日1-2 AM是我们再次进行DST调整时),理论上这种方法应该调整它的时区来抵消一个小时。

我知道TimeZoneInfo支持DST,因为我可以使用下面的方法来显示各个时区的DST状态的bool

var TimeZoneList = TimeZoneInfo.GetSystemTimeZones(); 

    for (int i = 0; i < TimeZoneList.Count; i++) 
    { 
     Console.WriteLine(TimeZoneList[i].Id + ": " + TimeZoneList[i].SupportsDaylightSavingTime); 
    } 

我的问题是,缺什么,我dateTimeToUnixTime()方法,将允许自动调节并根据DST条件偏差?

+1

Unix时代是基于UTC的。由于您假定所有输入都是基于UTC的,并且输出必须是基于UTC的,因此调整DST偏移的UTC偏移量根本没有任何意义。 –

+0

你是对的 - 我错过了我的问题中的一个重要部分。我道歉。我现在纠正了它。你在上面看到的第一个“时钟”是''DateTime'到'UnixTime'的转换(的确是UTC)。第二种转换采用带有“时区说明符”的'UnixTime',因此输出是时区相关和本地化的。 – theGreenCabbage

回答

2

假设你的时代开始于1/1/1970,然后我们可以使用一个DateTimeOffset_1970为您的时代,需要的秒添加到_1970然后用TimeZoneInfo.ConvertTime与夏令指定的时区获得一个约会时间调整(如适用)。使用DateTimeOffset而非DateTime这一点非常重要,这样在获取字符串时将保留正确的偏移量。

private static readonly DateTimeOffset _1970 = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); 
public string UnixTimeToDateTime(int unixInput, string outputFormat, string timeZoneStandardName) 
{ 
    var objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneStandardName); 
    var utcDate = _1970.AddSeconds(unixInput); 
    DateTimeOffset localDate = TimeZoneInfo.ConvertTime(utcDate, objTimeZoneInfo); 
    return localDate.ToString(outputFormat); 
} 

//1970-01-01T13:00:00+13:00 
Console.WriteLine(UnixTimeToDateTime(0, "yyyy-MM-dd'T'HH:mm:sszzz", "New Zealand Standard Time")); 

//1970-01-01T08:00:00+08:00 
Console.WriteLine(UnixTimeToDateTime(0, "yyyy-MM-dd'T'HH:mm:sszzz", "Singapore Standard Time")); 

//1969-12-31T19:00:00-05:00 
Console.WriteLine(UnixTimeToDateTime(0, "yyyy-MM-dd'T'HH:mm:sszzz", "Eastern Standard Time")); 

需要注意的是使用的TimeZoneInfo可能没有accurate information有关历史数据的调整是非常重要的,因此,如果这对你很重要,那么你可以使用库会更好,如Node Time

+0

我会尽快给你回复。 – theGreenCabbage

+0

PERFECTO:http://puu.sh/7Lvm7/be1b6a6780。png – theGreenCabbage

+0

很酷,输出很整洁! – row1