下面是我使用发生在三个输入的方法,包括:使用的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()
是我的第二个“时钟”
鉴于时间的列表和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条件偏差?
Unix时代是基于UTC的。由于您假定所有输入都是基于UTC的,并且输出必须是基于UTC的,因此调整DST偏移的UTC偏移量根本没有任何意义。 –
你是对的 - 我错过了我的问题中的一个重要部分。我道歉。我现在纠正了它。你在上面看到的第一个“时钟”是''DateTime'到'UnixTime'的转换(的确是UTC)。第二种转换采用带有“时区说明符”的'UnixTime',因此输出是时区相关和本地化的。 – theGreenCabbage