gpt4 book ai didi

c# - 将纪元时间戳转换为东部时间并使用 Nodatime 反转的优雅方法

转载 作者:行者123 更新时间:2023-11-30 19:58:29 25 4
gpt4 key购买 nike

我正在研究 writing a managed wrapper around Massachusetts Bay Transportation Authority (MBTA) Realtime API .他们有一个 API 返回服务器时间,它是 unix 时间戳(纪元)。我在其下实现它的库是 PCL Profile 78,这意味着我对 BCL TimeZone 的支持有限,所以我求助于使用 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 是一个残酷的 hack

最佳答案

首先,如评论中所述,最好在整个代码中使用 Noda Time 类型 - 只有当您确实必须时才求助于 DateTime。这应该会导致整个代码明显更简洁。

将 Unix 时间戳转换为 Instant 非常简单:

Instant instant = Instant.FromUnixTimeSeconds(seconds);

然后您可以根据当前代码转换为 ZonedDateTime...如果您确实需要使用 DateTime,使用 ToDateTimeUnspecified 就可以了>.

相反,您当前的代码在我看来是错误的 - 您假设 DateTime 实际上是一个 UTC 值。这将与您以后使用时区不一致。我怀疑您想将输入转换为 LocalDateTime,然后应用时区。例如:

public static long MbtaDateTimeToUnixTimestamp(DateTime time)
{
var local = LocalDateTime.FromDateTime(time);
var zoned = local.InZoneStrictly(mbtaTimeZone);
var instant = zoned.ToInstant();
return instant.Ticks / NodaConstants.TicksPerSecond;
}

注意 InZoneStrictly 调用。如果您传入不存在的本地时间存在两次的本地时间,这将引发异常 - 在这两种情况下都是由于 DST 转换。这很可能不是您想要的 - 您确实需要考虑在这些情况下您希望发生什么,或者尽量避免它们可行。查看time zones section of the documentation了解更多详情和选项。

关于c# - 将纪元时间戳转换为东部时间并使用 Nodatime 反转的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26691762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com