Java 8 LocalDate 到 JavaScript 日期

Posted

技术标签:

【中文标题】Java 8 LocalDate 到 JavaScript 日期【英文标题】:Java 8 LocalDate to JavaScript Date 【发布时间】:2017-03-29 11:48:01 【问题描述】:

我想将此 Java LocalDate 转换为 javascript Date


    "date": 
        "year": 2016,
        "month": "NOVEMBER",
        "dayOfMonth": 15,
        "monthValue": 11,
        "dayOfWeek": "TUESDAY",
        "era": "CE",
        "dayOfYear": 320,
        "leapYear": true,
        "chronology": 
            "id": "ISO",
            "calendarType": "iso8601"
        
    

【问题讨论】:

【参考方案1】:

您的日期字符串未指定时区。您还缺少时间信息,而 JavaScript 日期按设计存储一天中的时间。

您的字符串几乎是有效的 JSON,因此您可以通过 JSON.parse() 解析它。它只缺少一个结束 括号。

考虑到上述说明,您可以使用以下方法:

var input = JSON.parse('"date":"year":2016,"month":"NOVEMBER","dayOfMonth":15,"monthValue":11,"dayOfWeek":"TUESDAY","era":"CE","dayOfYear":320,"leapYear":true,"chronology":"id":"ISO","calendarType":"iso8601"');
            
var day = input.date.dayOfMonth;
var month = input.date.monthValue - 1; // Month is 0-indexed
var year = input.date.year;

var date = new Date(Date.UTC(year, month, day));

console.log(date); // "2016-11-15T00:00:00.000Z"

【讨论】:

时区不是“丢失” - 它被设计排除在外。这是一个本地日期。【参考方案2】:

当您将时间类型从 Java 发送到其他系统时,您应该清楚地了解时间和时区等内容。如果实例确实是 Local 日期,您不想通过选择任意时区将其转换为通用时间轴上的瞬间。 UTC 是任意的。 默认时区也是如此。

2016 年 3 月 14 日对全球另一端的系统来说应该意味着同样的事情。 ISO8601 就是为此目的而存在的。

我建议在将 Java LocalDate 发送到 JS 客户端时,使用 DateTimeFormatter.ISO_LOCAL_DATE.format(localDate) 将其编码为 ISO8601 格式的字符串,并使用 LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE) 从 JSON 中解析。

JavaScript 的 Date 更像是旧的 Java Date 类,并且名称类似。然而,JavaScript 的Date 会很高兴地通过构造或通过Date.parse() 函数解析ISO8601 格式的字符串,并将通过Date.toISOString() 生成ISO8601 字符串。请注意,JavaScript 会将缺少的时区(在 Java 中表示本地值)解释为 UTC。当您指的是 UTC 并假设 JS 客户端始终向您发送分区值时,您可以始终使用 Zulu 时区来明确。

或者只使用 JS-Joda。

【讨论】:

以上是关于Java 8 LocalDate 到 JavaScript 日期的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoDB 中存储 java 8 LocalDate

Java 8 LocalDate:确定每月的哪个星期一(第 1、第 2、第 3 等)

Java 8 Time Api 使用(LocalDate,LocalTime和LocalDateTime等)

Java 8 Time Api 使用(LocalDate,LocalTime和LocalDateTime等)

在数据库中使用Java 8 LocalDate和LocalDateTime进行Hibernate

使用 Java 8 流在 LocalDate 属性的对象列表中查找最近的日期