Как представить текущее время Великобритании? - PullRequest
8 голосов
/ 27 октября 2010

У меня возникла проблема при преобразовании дат между моим сервером и клиентом, где оба работают в Германии. Региональные настройки на клиентских компьютерах могут быть установлены как в Великобритании, так и в Германии. Я получаю дату с сервера в формате CET, и мне нужно представить это время в пользовательском интерфейсе как британское время. Например, время, полученное с сервера, например, 01/07/2010 01:00:00, должно быть представлено в интерфейсе пользователя как 01/07/2010 00:00:00. Я написал конвертер для этой цели, однако во время его работы разница во времени составляет 2 часа. Ниже приведен код, пожалуйста, вы можете помочь?

public class LocalToGmtConverter : IDateConverter
{
    private readonly TimeZoneInfo timeZoneInfo;

    public LocalToGmtConverter()
        : this(TimeZoneInfo.Local)
    {

    }
    public LocalToGmtConverter(TimeZoneInfo timeZoneInfo)
    {
        this.timeZoneInfo = timeZoneInfo;
    }

    public DateTime Convert(DateTime localDate)
    {
        var utcKind = DateTime.SpecifyKind(localDate, DateTimeKind.Utc);
        return utcKind;
    }

    public DateTime ConvertBack(object fromServer)
    {
        DateTime serverDate = (DateTime)fromServer;

        var utcOffset = timeZoneInfo.GetUtcOffset(serverDate);

        var uiTime = serverDate- utcOffset;

        return uiTime;

    }
}

Ответы [ 5 ]

20 голосов
/ 27 октября 2010

Я думаю, вы переводите время в UTC (а не в Великобританию). Поскольку в Центральной Европе еще есть летнее время (если температура говорит об обратном), разница составляет +2 часа до 31 октября.

Если вы знаете, что переводите из Германии в Великобританию (то есть CEST в BST летом и CET в GMT зимой), почему бы вам не вычесть 1 час?

Если вам нужна информация о часовом поясе для Великобритании, вы можете создать ее, используя

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");

Тогда вы можете конвертировать дату, используя

var newDate = TimeZoneInfo.ConvertTime(serverDate, TimeZoneInfo.Local, britishZone);
1 голос
/ 27 октября 2010

Используйте TimeZoneInfo.ConvertTime , чтобы преобразовать исходный часовой пояс (CET) в целевой часовой пояс (Великобритания).

public static DateTime ConvertTime(
    DateTime dateTime,
    TimeZoneInfo sourceTimeZone,
    TimeZoneInfo destinationTimeZone
)

Полное руководство по MSDN здесь :

Преобразование времени между часовыми поясами

Модифицированный пример кода из MSDN:

DateTime ceTime = new DateTime(2007, 02, 01, 08, 00, 00);
try
{
   TimeZoneInfo ceZone = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard        Time");
   TimeZoneInfo gmtZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
   Console.WriteLine("{0} {1} is {2} GMT time.", 
           ceTime, 
           ceZone.IsDaylightSavingTime(ceTime) ? ceZone.DaylightName : ceZone.StandardName, 
           TimeZoneInfo.ConvertTime(ceTime, ceZone, gmtZone));
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("The registry does not define the required timezones.");
}                           
catch (InvalidTimeZoneException)
{
   Console.WriteLine("Registry data on the required timezones has been corrupted.");
}
0 голосов
/ 27 марта 2018

Вот что я делаю:

    var BritishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");

    DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified);

    DateTimeInBritishLocal = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local, BritishZone);

Мне нужно было добавить часть SpecifyKind или ConvertTime создает исключение

0 голосов
/ 27 марта 2014

Я понимаю, что вопрос касается C #, но если все, что вам нужно, - это одно преобразование, вы можете сделать это из командной строки PowerShell:

$d = [DateTime]::Parse("04/02/2014 17:00:00")
$gmt = [TimeZoneInfo]::FindSystemTimeZoneById("GMT Standard Time");
[TimeZoneInfo]::ConvertTime($d, $gmt, [TimeZoneInfo]::Local)

Этот скрипт конвертирует 17:00 по британскому времени в ваш местный часовой пояс. Для меня это будет CST. Интересно отметить, что если бы я установил дату на 27.03.2014, результат был бы другим, потому что переход на летнее время в Великобритании наступил в разные даты, чем в США.

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

Лучший подход к местному времени - хранить их в унифицированном представлении, например UTC.

Таким образом, вы можете преобразовать все времена ввода в UTC (через .ToUniversalTime()) и сохранить (или передать) его значение. Когда вам нужно показать его, просто конвертируйте обратно, используя .ToLocalTime().

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

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

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