作为软件架构师,我真的很想使用NodaTime,但是它的“本地”概念使我们的代码极难使用(这使我和我的团队发疯)!当提到“本地”和“全局”时间时,文档说明以下内容:
关键的不同之处在于,由于时区不同,世界各地的人们将同时就全球价值达成共识,而对于相同的全球价值,他们可能都会看到不同的本地价值。
这句话通过使用本地时间的定义来定义全局时间的含义。因此,在我们了解全球时间之前,我们必须首先了解本地时间的含义。
Google(和许多其他词典类似)将“本地时间”定义为:
在特定地区或时区中估计的时间。
- 从特定地点的太阳经子午线过渡算起的时间(定义为中午)。
因此,本地时间是由(或绑定到)时区定义的特定时间-知道了。现在我们完全了解全球时间的含义;好吧,下一句话:
本地值在Noda Time中没有关联的时区;
等待!什么...?!刚刚完成使用的当地时间(其普遍接受的定义界定全球化时代的文件被关联到一个时区),现在他们决定完全否定它的意义,如果这是真的,什么是全球现在时间是什么意思?恕我直言,绝对没有。
该文档继续说明...
特别是,它不仅是“固定于运行代码的计算机的本地时间的日期和时间”
我对这个陈述有两个问题:
X is equal to (NOT X) is true
。我投票赞成我们使用比“本地”更好的定义,“原始”一词怎么样?意思是:
处于或接近自然状态:未经加工或纯化。
嗯...
[原始]值在Noda Time中没有关联的时区;特别是,它不仅是“固定于运行代码的计算机的本地时间的日期和时间”
现在听起来更像是文档试图传达的定义。
也许其他人可以提出比“原始”更好的词;但是重点是,请给我们“本地”的真实含义,因为“本地”在软件和生活中都具有非常真实和非常有用的含义。
因此,我们可以将重命名Local[Date][Time]
类Raw[Date][Time]
和(可选)添加一个名为新类Local[Date][Time]
是被绑定到计算机的本地时区?
@Michal和@J ...-
我们遇到的问题不是LocalDateTime
我们“本地”的了解(因为它是无区域的)。我们在LocalDateTime上遇到的问题是它没有区域。本质LocalDateTime
上,根据定义,应该是的一种特殊类型ZonedDateTime
。(就像UTC是概念(和具体)的特殊类型ZonedDateTime
。因此,UTC可以有它自己的一套的类型,如:Utc[Date][Time]
;其中,给予正确的问题域,可能是非常有用的,因为,UtcDateTime
一直没有“取'我们可以在不干扰NodaTime的情况下创建这样的概念。)
回到我们的问题,例如:如果我有两个ZonedDateTimes,一个来自纽约,另一个来自西雅图,我想从我当前的位置研究这两个ZonedDateTimes(比方说:达拉斯)。我想写...
LocalDateTime fromNy = newYork.LocalDateTime;
LocalDateTime fromWa = seattle.LocalDateTime;
但是,相反,我得到了两个彼此不相关的不相关的本地日期时间。实际上,如果不是var名称,我将不知道哪个是哪个。
我想要的是两个ZonedDateTimes,它们已转换为我的本地时区,如属性名所示。现在,这两个LocalDateTime值(其中LocalDateTime是ZonedDateTime的一种特殊类型)具有相关的含义。我知道,通过执行以下操作,我可以得到一些接近我想要的东西;但是它很凌乱,不能传达相同的语义,并且会丢失时区信息。
DateTimeZone ct = BclDateTimeZone.ForSystemDefault();
LocalDateTime tx1 = newYork.WithZone(ct);
LocalDateTime tx2 = seattle.WithZone(ct);
我还希望能够再次像这样转换值:
ZonedDateTime wa = tx2.WithZone(seattleTimeZone);
ZonedDateTime nw = tx2.WithZone(nyTimeZone);
这也将允许:
instant.InUtc();
instant.InZone(zone);
instant.InLocal();
这样就可以将即时时间映射到3个最常见的时区;UTC,本地和其他。但是我不能,因为LocalDateTime不是ZonedDateTime的特殊类型。
恕我直言,NodaTime 1.x很不错,但是对于黄金时间使用来说,它不够灵活(或不稳定)。但好消息是,离它并不遥远。希望在2.0(或更早版本)中可以解决这些问题。
@Michal-我喜欢您的Noda[Date][Time]
反对的想法Raw[Date][Time]
。
您可能对此感到困惑的是:
LocalDateTime
=特定日历中的通用时间(例如公历),但由于没有TimeZone
附加时间,因此您无法区分发生在全局时间线上的确切时间。想象这只是一个通用值。例如14:00
。您不会知道确切的时间14:00
是因为您错过了它所在的TimeZone。
ZonedDateTime
=LocalDateTime
在特定时区(您可能会想象为LocalDateTime
)。
我可能确实同意您的看法,这有点误导。而且我希望它被调用NodaDateTime
和ZonedDateTime
被调用LocalDateTime
,因为那样看起来确实更合乎逻辑。
编辑-以下评论
就个人而言,我很少使用了LocalDateTime
,如果你坚持之间Instant
和ZonedDateTime
你可能会干掉你的很多麻烦的。在类型之间进行转换有一个非常不错的概览图:
因此,在您的情况下,您想要做的是将转换从转换ZoneDateTime
为Instant
,然后再转换为您想要的转换ZonedDateTime
(您的系统tz)
例如
var myTz = BclDateTimeZone.ForSystemDefault();
var fromNy = SystemClock.Instance.Now.InZone(DateTimeZoneProviders.Tzdb["America/New_York"]);
// fromNy = 2015-03-22T08:28:56 America/New_York (-04)
var fromLa = SystemClock.Instance.Now.InZone(DateTimeZoneProviders.Tzdb["America/Los_Angeles"]);
// fromLa = 2015-03-22T05:28:56 America/Los_Angeles (-07)
var fromNyInMyTz = fromNy.ToInstant().InZone(myTz);
// localFromNy = 2015-03-22T12:28:56 GMT Standard Time (+00)
var fromLaInMyTz = fromLa.ToInstant().InZone(myTz);
// localFromLa = 2015-03-22T12:28:56 GMT Standard Time (+00)
您还可以创建扩展方法:
public static class NodaExtensions
{
public static ZonedDateTime InUtc(this ZonedDateTime dt)
{
return dt.ToInstant().InUtc();
}
public static ZonedDateTime InZone(this ZonedDateTime dt, DateTimeZone tz)
{
return dt.ToInstant().InZone(tz);
}
public static ZonedDateTime InLocal(this ZonedDateTime dt)
{
return dt.ToInstant().InZone(BclDateTimeZone.ForSystemDefault());
}
}
允许:
var fromNyInUtc = fromNy.InUtc();
var fromLaInUtc = fromLa.InUtc();
var fromNyInZone = fromNy.InZone(myTz);
var fromLaInZone = fromLa.InZone(myTz);
var fromNyInLocal = fromNy.InLocal();
var fromLaInLocal = fromLa.InLocal();
这是您想要的东西吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句