Я работаю над написанием управляемой оболочки для API реального времени Управления транспорта Массачусетского залива (MBTA). У них есть API, который возвращает время сервера, которое является временной меткой unix (эпохой). Библиотека, в которой я это реализую, — PCL Profile 78
, что означает, что у меня ограниченная поддержка BCL TimeZone, поэтому я прибегнул к использованию Nodatime
Я пытаюсь преобразовать время, возвращаемое с сервера, в восточное время, которое America/New_York
является объектом DateTime
и наоборот. Мой текущий код очень грязный
public static class TimeUtils
{
static readonly DateTimeZone mbtaTimeZone = DateTimeZoneProviders.Tzdb["America/New_York"];
static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static DateTime GetMbtaDateTime (long unixTimestamp)
{
var mbtaEpochTime = epoch.AddSeconds (unixTimestamp);
var instant = Instant.FromUtc (mbtaEpochTime.Year, mbtaEpochTime.Month,
mbtaEpochTime.Day, mbtaEpochTime.Hour, mbtaEpochTime.Minute, mbtaEpochTime.Second);
var nodaTime = instant.InZone (mbtaTimeZone);
return nodaTime.ToDateTimeUnspecified ();
}
public static long MbtaDateTimeToUnixTimestamp (DateTime time)
{
TimeSpan secondsSinceEpochMbtaTz = time - epoch;
var instant = Instant.FromUtc (time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second);
var mbtaTzSpan = mbtaTimeZone.GetUtcOffset (instant).ToTimeSpan ();
var epochDiff = secondsSinceEpochMbtaTz - mbtaTzSpan;
return (long)epochDiff.TotalSeconds;
}
}
Есть ли другой способ написать это просто. Я надеюсь, что Nodatime должен поддерживать преобразование времени эпохи в America/New_York
DateTime и America/New_York
DateTime в время эпохи. Мой метод MbtaDateTimeToUnixTimestamp
- брутальный взлом
DateTime
вообще? Noda Time работает лучше всего, когда вы используете его во всем коде. - person Jon Skeet   schedule 01.11.2014