Как преобразовать строку в локальную дату и время?

Я пытаюсь преобразовать строку этого формата:

MM/dd/yyyy HH:mm

Данные взяты из базы данных США, т. Е. 20.09.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"));

Все они работают локально (на американской машине), но на европейской машине они не переводят время в местное.

Спасибо Тони

 Christopher B. Adkins06 окт. 2010 г., 16:07
Ваш компьютер - американская машина или что?
 Aykut Çevik06 окт. 2010 г., 16:06
Вы тестировали функцию DateTime.Parse?
 Kendrick06 окт. 2010 г., 16:07
В чем проблема? Правильно ли проанализирована дата в обоих случаях, и это просто проблема с отображением? Вот почему я использую только формат yyyy-MM-dd (хотя технически yyyy.MM.dd лучше, потому что его нельзя интерпретировать как расчетное или числовое значение)
 tony06 окт. 2010 г., 16:10
У меня есть машина в США и Европе, а также. Дело в том, что мне нужно хранить в CompletedDttm местное время, а не то, что у меня есть в строке, то есть американское время.
 Kendrick06 окт. 2010 г., 16:15
Так является ли проблема преобразования часового пояса, анализа или отображения?
 Christopher B. Adkins06 окт. 2010 г., 16:12
С каким временем США вы работаете? Это будет иметь большое значение. Также, если вы ищете конвертацию из стандартного времени, тогда используйте Utc, а не американское время.
 Kendrick06 окт. 2010 г., 16:08
Кроме того, вы беспокоитесь о часовых поясах здесь?

Ответы на вопрос(6)

ОБНОВИТЬ: Вы должны знатьчасовой пояс данных (не только, что это «США»), а также интерпретатор, если вы хотите надежно преобразовать его во что-нибудь еще. Вы смотрите не только на смещение часов, но и на летнее время, которое зависит от местоположения (не все локали соблюдают его). Восточный -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 который также будет иметь информацию о летнем времени.

 tony06 окт. 2010 г., 16:13
Время, которое я получаю, приходит из базы данных США. Вы говорите, чтобы сначала преобразовать в GMT, а затем в местный?
 Christopher B. Adkins06 окт. 2010 г., 16:30
Он не дает много информации для работы, поэтому я думаю, что это лучший ответ, который он может ожидать.
 jvenema06 окт. 2010 г., 16:13
Пример, который вы привели, предполагает, что у него есть дата по местному времени ... которого у него нет.

анализ будет предполагать, что вы хотите проанализировать строку в вашем текущем часовом поясе. Культура США просто означает ожидаемоеформат строки, и не имеет никакого отношения к часовому поясу (например, в США это может быть EST или PST).

В вашей строке нет информации о часовом поясе, поэтому, естественно, вы получите значение в любом часовом поясе. Вы также можете:

Добавить информацию о часовом поясеИзменить часовой пояс потом

вы не сможете узнать британское время / канадское время и т. Д., Поскольку вы не знаете, кто (какая часть света) ввела это время. Поскольку вы специально указали, что время соответствует времени США, вы можете добавить разницу во времени для разных частей света, чтобы отобразить местное время.

что это проблема отображения, но мне нужно больше информации, чтобы быть уверенным. Попробуйте отобразить даты в формате гггг-ММ-дд в обоих случаях, чтобы проверить, есть ли проблема в разборе или отображении. Вы можете создать объект информации пользовательского формата, если точно знаете, что хотите принять или отобразить:

    public static DateTimeFormatInfo GetISOFormatInfo()
    {
        DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
        dtFormat.DateSeparator = "-";
        dtFormat.TimeSeparator = ":";
        dtFormat.ShortDatePattern = "yyyy-MM-dd";
        dtFormat.ShortTimePattern = "HH:mm:ss";
        return dtFormat;
    }
Решение Вопроса

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

 Steve Townsend25 мая 2011 г., 16:40
@ Scorpion - MSDN говорит, что .Net 3.5 также
 tony06 окт. 2010 г., 16:24
Это сработало бы, если я знаю, что нахожусь в Великобритании, откуда мне знать, где я нахожусь? Другими словами, как я могу запросить местную культуру?
 Steve Townsend06 окт. 2010 г., 16:38
Я изменил логику, предполагая, что входные данные - EST, а не Local в преобразовании. Я все еще не на 100% надежен, я думаю, и требует, чтобы новые целевые часовые пояса обрабатывались по мере необходимости.
 Steve Townsend06 окт. 2010 г., 16:32
@tony - если ваше время соответствует часовому поясу США, вы передаете культуру США вызову ParseExact. Код выше предполагает, что он работает на коробке в США. Извините, но я в США, так что трудно проверить ваш случай за пределами США. Я думаю, что другие комментарии относительно отсутствующей информации в дате / времени, как хранятся, являются правильными, кстати. Если вы не можете изменить базу данных, это больше работы, чтобы все дела работали должным образом.
 Scorpion25 мая 2011 г., 15:20
@Тони; Я думаю, что TimeZoneInfo доступен только в 4.0

/' на всю строку. Вы получите "09", "20" и "2010 14:30", затем примените разделение еще 2 раза с помощью '' и ':'

Ваш ответ на вопрос