C #: временная метка Unix и дата-время

#c# #.net #datetime #timestamp

#c# #.net #дата-время #временная метка

Вопрос:

мы разрабатываем веб-приложение на C #, которое должно иметь дело с временными метками Unix и объектами DateTime на C #. Временная метка должна быть преобразована в объект DateTime.

Следующий пример показывает мою проблему: дата-время должно быть ‘18.10.2011 14:02:32’

 System.DateTime time = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
time = time.AddSeconds(1318939352);
System.Console.Out.WriteLine("Time: "   time); // -> 18.10.2011 12:02:32
  

Если я вызываю ToLocalTime() на своем компьютере разработчика, дата и время указаны правильно:

 System.DateTime time = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
time = time.AddSeconds(1318939352).ToLocalTime();
System.Console.Out.WriteLine("Time: "   time); // -> 18.10.2011 14:02:32
  

Но приложение будет работать на серверах, размещенных в другом часовом поясе (стандартное время GMT), поэтому мне приходится иметь дело с другим часовым поясом, и второй пример завершается с ошибкой на этих серверах.
Независимо от того, где я размещаю приложение, дата в этом случае всегда должна быть напечатана как 18.10.2011 14:02:32.

Кто-нибудь знает, как я могу это сделать? Заранее спасибо!

С наилучшими пожеланиями, Торстен

Комментарии:

1. Почему бы не указать DateTimeKind.Utc , когда вы создаете экземпляр, это работает? как new System.DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc); (надеюсь, 14:02:32 по Гринвичу)

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

3. @V4Vendetta — 14:02:32 — это GMT 2

4. Ваша временная метка unix уже соответствует местному времени. Это ваша проблема.

5. @Xanatos: если моя временная метка unix уже находится по местному времени, что бы вы сделали, чтобы дата-время было правильным?

Ответ №1:

Вы можете посмотреть TimeZoneInfo

 public struct DateTimeWithZone
{
    private readonly DateTime utcDateTime;
    private readonly TimeZoneInfo timeZone;

    public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
    {
        utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone); 
        this.timeZone = timeZone;
    }

    public DateTime UniversalTime 
    { 
       get {  return utcDateTime; } 
    }

    public TimeZoneInfo TimeZone 
    { 
       get { return timeZone; } 
    }

    public DateTime LocalTime
    { 
        get { return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); }
    }        
}