为什么LocalDateTime实际上不是本地日期和时间?

bu夫

作为软件架构师,我真的很想使用NodaTime,但是它的“本地”概念使我们的代码极难使用(这使我和我的团队发疯)!当提到“本地”和“全局”时间时文档说明以下内容:

关键的不同之处在于由于时区不同,世界各地的人们将同时全球价值达成共识,而对于相同的全球价值,他们可能都会看到不同的本地价值

这句话通过使用本地时间的定义来定义全局时间的含义。因此,在我们了解全球时间之前,我们必须首先了解本地时间的含义。

Google(和许多其他词典类似)将“本地时间定义为:

在特定地区或时区中估计的时间

  • 从特定地点的太阳经子午线过渡算起的时间(定义为中午)。

因此,本地时间是由(或绑定到)时区定义的特定时间-知道了。现在我们完全了解全球时间的含义;好吧,下一句话:

本地值在Noda Time中没有关联的时区

等待!什么...?!刚刚完成使用的当地时间(其普遍接受的定义界定全球化时代的文件关联到一个时区),现在他们决定完全否定它的意义,如果这是真的,什么是全球现在时间是什么意思?恕我直言,绝对没有。

该文档继续说明...

特别是,它不仅是“固定于运行代码的计算机本地时间日期和时间

我对这个陈述有两个问题:

  1. 文档不能使用“本地时间”的通用定义来尝试描述不是本地时间的内容。就像说:X is equal to (NOT X) is true
  2. 由于使用计算机的日期和时间恰好是“本地时间”的定义,那么我称本地时间为什么?

我投票赞成我们使用比“本地”更好的定义,“原始”一词怎么样?意思是:

处于或接近自然状态:未经加工或纯化。

嗯...

[原始]值在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]

米哈尔·西尚(Michal Ciechan)

您可能对此感到困惑的是:

LocalDateTime=特定日历中的通用时间(例如公历),但由于没有TimeZone附加时间,因此您无法区分发生在全局时间线上的确切时间。想象这只是一个通用值。例如14:00您不会知道确切的时间14:00是因为您错过了它所在的TimeZone。

ZonedDateTime=LocalDateTime在特定时区(您可能会想象为LocalDateTime)。

我可能确实同意您的看法,这有点误导。而且我希望它被调用NodaDateTimeZonedDateTime被调用LocalDateTime,因为那样看起来确实更合乎逻辑。

编辑-以下评论

就个人而言,我很少使用了LocalDateTime,如果你坚持之间InstantZonedDateTime你可能会干掉你的很多麻烦的。在类型之间进行转换有一个非常不错的概览图:

摘自:nodatime.org-用户指南-类型之间的转换

nodatime.org-用户指南-类型之间的转换

因此,在您的情况下,您想要做的是将转换从转换ZoneDateTimeInstant,然后再转换为您想要的转换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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么LocalDateTime实际上不是本地日期和时间?

来自分类Dev

为什么Python的randint函数实际上不是随机的?

来自分类Dev

实际上,为什么&&和||重载?不短路吗?

来自分类Dev

为什么这个内射型家庭实际上不是内射型?

来自分类Dev

为什么 vue 文档说 refs 实际上不是反应性的

来自分类Dev

为什么parLapplyLB实际上没有平衡负载?

来自分类Dev

为什么此代码实际上可以正常工作?

来自分类Dev

debug和packageName字段实际上是做什么的?

来自分类Dev

异步实际上不是异步的

来自分类Dev

AsyncTask 实际上不是异步的

来自分类Dev

日期和时间(本地时间而不是UTC)(最大值)

来自分类Dev

为什么以下代码需要花费不同的时间执行(numpy数组内部实际上发生了什么)?

来自分类Dev

为什么实际上会跳过compileJava?

来自分类Dev

为什么首选laravel hometed?它实际上是做什么的?

来自分类Dev

Mongodb的Compact实际上做什么?

来自分类Dev

Kubernetes实际上是做什么的?

来自分类Dev

(void)var实际上做什么?

来自分类Dev

->>实际上是做什么的?

来自分类Dev

Perl中的$$实际上返回什么?

来自分类Dev

Cron实际上什么也没做

来自分类Dev

串行的真正含义是什么?USB3/SATA实际上不是并行的吗?

来自分类Dev

具有固定标头的100%高度div和边距实际上不是100%

来自分类Dev

@property在幕后实际上是做什么的。和self->和_下划线

来自分类Dev

为什么我的“安全括号”实际上阻止了此SQL的工作?

来自分类Dev

为什么git认为master在远程后面,而实际上却在后面呢?

来自分类Dev

实际上,为什么CocoaPods不安装最新版本的Pod?

来自分类Dev

为什么我的Rails迁移“成功”更新但实际上没有更改记录?

来自分类Dev

如果Boolean(1.2)实际上为true,为什么1.2 == true会返回false?

来自分类Dev

使用类属性代替JSF组件的styleClass实际上可以工作,为什么?

Related 相关文章

  1. 1

    为什么LocalDateTime实际上不是本地日期和时间?

  2. 2

    为什么Python的randint函数实际上不是随机的?

  3. 3

    实际上,为什么&&和||重载?不短路吗?

  4. 4

    为什么这个内射型家庭实际上不是内射型?

  5. 5

    为什么 vue 文档说 refs 实际上不是反应性的

  6. 6

    为什么parLapplyLB实际上没有平衡负载?

  7. 7

    为什么此代码实际上可以正常工作?

  8. 8

    debug和packageName字段实际上是做什么的?

  9. 9

    异步实际上不是异步的

  10. 10

    AsyncTask 实际上不是异步的

  11. 11

    日期和时间(本地时间而不是UTC)(最大值)

  12. 12

    为什么以下代码需要花费不同的时间执行(numpy数组内部实际上发生了什么)?

  13. 13

    为什么实际上会跳过compileJava?

  14. 14

    为什么首选laravel hometed?它实际上是做什么的?

  15. 15

    Mongodb的Compact实际上做什么?

  16. 16

    Kubernetes实际上是做什么的?

  17. 17

    (void)var实际上做什么?

  18. 18

    ->>实际上是做什么的?

  19. 19

    Perl中的$$实际上返回什么?

  20. 20

    Cron实际上什么也没做

  21. 21

    串行的真正含义是什么?USB3/SATA实际上不是并行的吗?

  22. 22

    具有固定标头的100%高度div和边距实际上不是100%

  23. 23

    @property在幕后实际上是做什么的。和self->和_下划线

  24. 24

    为什么我的“安全括号”实际上阻止了此SQL的工作?

  25. 25

    为什么git认为master在远程后面,而实际上却在后面呢?

  26. 26

    实际上,为什么CocoaPods不安装最新版本的Pod?

  27. 27

    为什么我的Rails迁移“成功”更新但实际上没有更改记录?

  28. 28

    如果Boolean(1.2)实际上为true,为什么1.2 == true会返回false?

  29. 29

    使用类属性代替JSF组件的styleClass实际上可以工作,为什么?

热门标签

归档