我正在致力于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