我正在致力於writing a managed wrapper around Massachusetts Bay Transportation Authority (MBTA) Realtime API。他們有一個返回服務器時間的API,它是unix時間戳(epoch)。在這我實現它的圖書館是PCL Profile 78
這意味着我已經限制了BCL的時區支持,所以我採取使用Nodatime
使用Nodatime將時代戳記轉換爲東方時間的優雅方法
我試圖從服務器返回到美國東部時間時間是America/New_York
爲DateTime
轉換對象和逆向的方式。 My current code is very dirty
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的效果最佳。 – 2014-11-01 18:47:44