【问题标题】:Convert Javascript date to java date将 Javascript 日期转换为 java 日期
【发布时间】:2021-06-07 03:46:39
【问题描述】:

我想将日期从前端传递到后端,然后保存到数据库。 对于前端 - 我正在使用 javascript 和 jQuery 对于后端springboot,java8。 当我在 JavaScript 中创建今年的日期时

let setDate = new Date(2022, 11, 31);
console.log(setDate);

我得到这样的输出:Sat Dec 31 2022 00:00:00 GMT+0530 (India Standard Time)

在javascript中:

reqObj.setDate = setDate;

Java 中的对象是String setDate 但是当涉及到后端 Spring Boot 控制器时,它变成: 2022-01-30T18:30:00.000Z(天减少一/时区从 IST 到 GMT 的变化)(数据类型是 java 中的字符串) 获得字符串后,我根据需要进行了一些格式更改:

private String getDate(String date) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MMM-yyyy");
    String resultsDate = "";
    try {
        resultsDate = sdf1.format(sdf.parse(date));
    } catch (Exception e) {
        logger.error(this.getClass().getName(), ".getDate() Exception : {}" + e);
    }
    return resultsDate;
}

时区更改导致日期更改,但日期应相同,即像 (2022-01-31T00:00:00.000Z) 如何从前端解决?

【问题讨论】:

  • 天减一。不,它从 IST(印度标准时间)转换为 UTC,减少了 5 个半小时
  • 您需要检查您如何将日期发送到服务器以及如何保存?
  • 您还没有告诉我们您是如何将 JavaScript 日期发送到服务器的。您不能发送 Date 对象,因此您将发送其他内容。它可能是 Date 的毫秒数(从本质上讲是 UTC),也可能是某种字符串,有或没有时区信息。在不知道您发送的内容的情况下,我们无法帮助您。 “我不关心时区” - 这可能是一个错误。相反,请注意时区,如果您想将事物视为独立于时区,请始终使用 UTC。
  • 00:00:00 GMT+053000:00:00.000Z的时间不同
  • 我建议在 Java 中不要使用 SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APIInstant

标签: javascript java date timezone


【解决方案1】:

如果我理解正确,在服务器端,您需要日历日期,在您的示例中为 2022-12-31。既不是一天中的时间也不是时区。

你在 Spring 2022-01-30T18:30:00.000Z 中得到的是一个时间点。顺便说一句,正确的时间点,但如果我是正确的,你不需要时间点,那么这不是很有用。这只是我的一点猜测:您的浏览器知道您的时区设置,印度标准时间,因此基于它做了两件事:(1)它构造一个 JavaScript Date 代表您时间的开始区。 (2) 它在您的时区打印由 JavaScript Date 表示的时间点。浏览器进一步假设服务器不知道客户端时区,因此它将时间点转换为 UTC,得到2022-01-30T18:30:00.000Z。尾随 Z 发音为 Zulu,意思是 UTC。

所以我想您需要做的是说服客户端中的 JavaScript 代码发送没有时间和时区的日期。因为我根本不知道你的 JavaScript 代码,也不太了解 JavaScript,所以这里不能告诉你细节。

使用 java.time。 顺便说一句,我建议在 Java 中使用 java.time,这是现代 Java 日期和时间 API。假设您只能从客户端发送 2022-12-31,那么在 Java 中将其解析为日期非常容易:

    String dateString = "2022-12-31";
    LocalDate date = LocalDate.parse(dateString);
    System.out.println("Date parsed to: " + date);

输出:

解析日期:2022-12-31

LocalDate 是一个没有时间的日期,所以我认为你需要在这里。它本机解析格式2022-12-31,没有任何显式格式化程序。该格式称为 ISO 8601。

链接

【讨论】:

  • +1 在 Java 部分。对于 JavaScript,您首先使用 const d = new Date(); 获取当前时间戳(实际上是瞬间,例如 java.util.Date),然后您可以执行 `${d.getFullYear()}-${(d.getMonth()+1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}` 之类的操作,或者您可以依赖 en-CA 已经使用 ISO 格式并做d.toLocaleDateString('en-CA')
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多