#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); }
}
}