Как представить дату и время разных часовых поясов в C # - PullRequest
3 голосов
/ 17 июня 2010

У меня есть .NET WebService (написанный на C #), который должен обслуживать людей по всему миру.
С каждым запросом я получаю дату и время пользователя в своем часовом поясе в формате: yyyy/MM/dd HH:mm ZZZZ.
Я должен преобразовать строку во что-то, представляющее оригинальные дату и время и указывающее часовой пояс в GMT. Я должен сделать некоторые логические вычисления и сохранить его в базе данных.

Обычная дата DateTime не поддерживает это. у него нет свойства, указывающего часовой пояс. Когда я пытаюсь конвертировать мою строку в DateTime - она ​​просто конвертирует ее в мое местное время.

Я не хочу держать свое время в UTC, потому что у меня есть некоторая логика, которая должна выполняться для каждого пользователя в свое время.

Кто-нибудь знает класс C #, который обрабатывает это?

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Вы можете разобрать его с DateTimeOffset. Например:

using System;

class Program {
    static void Main(string[] args) {
        var s = "2009/01/10 17:18:44 -0800";
        var dto = DateTimeOffset.ParseExact(s, "yyyy/MM/dd HH:mm:ss zzzz", null);
        var utc = dto.UtcDateTime;
        Console.WriteLine(utc);
        Console.ReadLine();
    }
}

Выходные данные: 11.01.2009 1:18:44

2 голосов
/ 17 июня 2010

Не ясно, означает ли ZZZZ просто смещение (которое не является полной информацией о часовом поясе) или название часового пояса.Это важно, потому что смещение будет меняться со временем, обычно из-за перехода на летнее время.

Если это просто смещение, то DateTimeOffset из .NET 2.0SP1 покроет все, что вам нужно (но вам придетсябудьте осторожны из-за неполной информации).

Если это имя зоны реального времени, TimeZoneInfo из .NET 3.5 может вам помочь - в зависимости от формата имени.При этом используются имена Windows (например, «стандартное время по Гринвичу») вместо более распространенных имен zoneinfo (например, «Европа / Лондон»).Вам нужно будет хранить DateTime или (предпочтительно) DateTimeOffset вместе с TimeZoneInfo.

В будущем Noda Time сможет сделать это для васпроще - но еще не готово к печати. ​​

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