Как было указано в подобном вопросе , нужно быть осторожным, поскольку Windows использует очень вводящие в заблуждение имена (например: странное «романтическое стандартное время» для Европы / Парижа или «восточное стандартное время» "который странным образом действует как ET и использует летнее время, когда официальное определение говорит об обратном. Не говоря уже о восточное стандартное время США ).
Что касается отображения городов / штатов / стран из часовых поясов Windows, я еще не нашел никакого файла данных для этого, но я буду продолжать поиск. Я предполагаю, что может потребоваться найти данные для преобразования из часовых поясов Windows в часовые пояса Олсона, а затем оттуда в отдельные города / штаты / названия стран. Эта ссылка поможет с первым:
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
Имея это в виду, я заполнил пустые функции из основного вопроса (спасибо Jon и Yahia за указатели). Первая - это основная функция, которая будет полезна большинству людей. Две другие являются вторичными функциями, которые использует первая функция.
Я проверил их, и они работают на летнее время, хотя держу пари, что Джон Скит и другие смогут найти что-то вроде «незначительных» недостатков. Например, даты до 1601 года не будут работать, так как File Time Windows не поддерживает это. Также рекомендуется заключать вызовы этих функций в операторы try / catch, конечно, чтобы перехватывать ввод ложных данных и т. Д.
// Master conversion function
// Example use 1: convertTimezone("1/11/2011 00:00:00", "GMT Standard Time", "Eastern Standard Time") = "31/10/2011 20:00:00"
// Example use 2: convertTimezone("1/11/2011 00:00:00", "Eastern Standard Time", "GMT Standard Time") = "01/11/2011 04:00:00"
// Example use 3: convertTimezone("1/10/2011 00:00:00", "Eastern Standard Time", "GMT Standard Time") = "01/10/2011 05:00:00"
string convertTimezone(string time, string oldlocation, string newlocation)
{
long l = convertTime_AnyToFile(time, oldlocation);
string newtime = convertTime_FileToAny(l, newlocation);
return newtime;
}
// Example use 1: convertTime_AnyToFile("1/11/2011 00:00:00", "GMT Standard Time") = 129645792000000000
// Example use 2: convertTime_AnyToFile("1/11/2011 00:00:00","Eastern Standard Time") = 129645936000000000
long convertTime_AnyToFile(string time, string location)
{
DateTime a = DateTime.Parse(time );
DateTime b = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(a, location, "UTC");
return b.ToFileTime();
}
// Example use 1: convertTime_FileToAny(129645792000000000, "GMT Standard Time") = "1/11/2011 00:00:00"
// Example use 2: convertTime_FileToAny(129645936000000000,"Eastern Standard Time") = "1/11/2011 00:00:00"
string convertTime_FileToAny(long time, string location)
{
DateTime a = DateTime.FromFileTimeUtc(time);
DateTime b = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(a, location);
return b.ToString();
}
Несмотря на то, что он работает нормально (в рамках ограниченных тестов, которые я провел), прежде чем «поставить галочку» на своем собственном ответе, я мог бы сначала подождать некоторого отзыва, поскольку, возможно, кто-то сможет улучшить приведенный выше код.