Как преобразовать строку в локальную дату и время? - PullRequest
4 голосов
/ 06 октября 2010

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

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"));

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

Спасибо Tony

Ответы [ 6 ]

4 голосов
/ 06 октября 2010

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

3 голосов
/ 06 октября 2010

Попробуйте это - он преобразует местное время (введенное в формате США) в 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

3 голосов
/ 06 октября 2010

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

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

  1. Добавить информацию о часовом поясе
  2. Изменить часовой пояс впоследствии
0 голосов
/ 06 октября 2010

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

0 голосов
/ 06 октября 2010

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

    public static DateTimeFormatInfo GetISOFormatInfo()
    {
        DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
        dtFormat.DateSeparator = "-";
        dtFormat.TimeSeparator = ":";
        dtFormat.ShortDatePattern = "yyyy-MM-dd";
        dtFormat.ShortTimePattern = "HH:mm:ss";
        return dtFormat;
    }
0 голосов
/ 06 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...