【问题标题】:converting GMT format String to Datetime in spring boot Java在 Spring Boot Java 中将 GMT 格式字符串转换为日期时间
【发布时间】:2021-02-16 17:30:48
【问题描述】:
My Mongo Input Source data is 2020-04-14 00:00:00.0000000 (GMT-04:00), 
Data Type String
Error: Caused by: java.time.format.DateTimeParseException: Text '' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[na:1.8.0_222]

我做到了:

Command.java:

DateTimeFormatter dateTimeformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
List<RatingTiming> response = repo.findByserviceRequestedTimestampBetween(LocalDateTime.parse(query.getStartvalue(), dateTimeformatter), LocalDateTime.parse(query.getEndvalue(), dateTimeformatter));

Mogorepo.java:

public interface RatingResponseRepository extends MongoRepository<RatingTiming, String> {
    List<RatingTiming> findByserviceRequestedTimestampBetween(LocalDateTime startDate, LocalDateTime endDate);
}

Json.java:

@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss'")
@JsonDeserialize(using = DateDeserializer.class)
@JsonProperty("serviceRequestedTimestamp")
public LocalDateTime serviceRequestedTimestamp;

【问题讨论】:

  • 这能回答你的问题吗? Java String to DateTime
  • 这能回答你的问题吗? java SimpleDateFormat
  • 仅供参考: 2020-04-14 00:00:00.0000000 (GMT-04:00) != 2020-04-14 00:00:00.000Z 因为它们有不同的时区。 00:00 GMT-4 与 04:00 GMT+0 又名 04:00Z 相同。
  • 你可以像这样获得价值2020-04-14T04:00:00Z:OffsetDateTime.parse("2020-04-14 00:00:00.0000000 (GMT-04:00)", DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSS (OOOO)")).toInstant()
  • 您要求的格式 2020-04-14 00:00:00.000Z 有点搞笑,因为它类似于 ISO 8601 而不是 ISO 8601。ISO 8601 标准要求在时间部分之前有一个T,所以@987654336 @。考虑是否更喜欢这个。

标签: java date parsing


【解决方案1】:

编辑 问题被编辑后:您收到的异常消息 Text '' could not be parsed at index 0 表示您正在尝试将空字符串解析为日期时间,但由于预期会失败是字符串中的文本。我无法从您分离的 sn-ps 中看出空字符串是如何结束的。

java.time

恕我直言,您以错误的方式提出问题。只有在最简单的一次性程序中,您才应该将日期和时间从一种字符串格式转换为另一种格式。对于任何 Spring Boot 或其他严肃程序,您不应将日期和时间处理为字符串。您应该将它们解析为适当的日期时间对象,并且仅在需要提供字符串输出时才将它们格式化。

我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。解析你的源字符串:

    DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .appendPattern(" (OOOO)")
            .toFormatter();
    
    String inputSource = "2020-04-14 00:00:00.0000000 (GMT-04:00)";
    
    OffsetDateTime dateTime = OffsetDateTime.parse(inputSource, inputFormatter);
    System.out.println(dateTime);

目前的输出:

2020-04-14T00:00-04:00

有点长。我们可以直接从格式模式字符串创建DateTimeFormatter。使用构建器的优点包括:

  • 我们正在重用两个内置格式化程序,而不是从头开始构建所有内容。
  • ISO_LOCAL_TIME 在秒上接受可变数量的小数,因此我们得到了更灵活的格式化程序。

为了格式化输出的日期和时间,我假设 (1) 您确实想要 ISO 8601 格式输出,因为您的示例字符串非常相似,并且 (2) 您想要相同的时间点。

    String formattedDateTime = dateTime.format(DateTimeFormatter.ISO_INSTANT);
    System.out.println(formattedDateTime);

2020-04-14T04:00:00Z

时间已更改为 04:00 UTC,即您要求的尾随 Z 表示 UTC。这是正确的:当它是 4 AM UTC 时,它只是 00:00(午夜)在偏移量 GMT-04:00 的时区,源字符串来自哪里。您要求在秒上输入三位小数,但在 ISO 8601 中,小数为零时是可选的,因此此处不打印。如果您需要字符串与需要 ISO 8601 的系统进行数据交换,那么您已经准备就绪。

如果您想要相同的挂钟时间 00:00,即使它是不同的时区,您也可以:

    String formattedDateTime = dateTime.withOffsetSameLocal(ZoneOffset.UTC)
            .format(DateTimeFormatter.ISO_INSTANT);

2020-04-14T00:00:00Z

如果您真的想要您提到的确切格式,即使它不符合 ISO 8601,请使用自制格式化程序:

    DateTimeFormatter targetFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSX");
    String formattedDateTime = dateTime.withOffsetSameLocal(ZoneOffset.UTC)
            .format(targetFormatter);

2020-04-14 00:00:00.000Z

链接

【讨论】:

  • 感谢您的帮助和时间。上述选项之一是我想要的,但我仍然遇到同样的错误。我认为问题是我在哪里传递输入值。所以我的源日期是 STRING : 2020-04-14 09:10:57.0851800 (GMT-04:00) 和预期的日期时间将与 teradata 驱动程序时间表一起使用:select ((VLUTN_START_DTM (format 'yyyy-mm-dd')) (varchar(10))) || 'T' || ((VLUTN_START_DTM (格式'hh:mi:ss.s(3)')) (varchar(12))) || 'Z'(标题''),((VLUTN_END_DTM(格式'yyyy-mm-dd'))(varchar(10)))|| 'T' || ((VLUTN_END_DTM (格式'hh:mi:ss.s(3)')) (varchar(12))) || 'Z'(标题'')(标题'')
  • cntd:我尝试将 teradata 日期格式更改为 GMT-04:00 格式,但无法正常工作。现在,我在 unix 中调用 json 脚本:“queryname”:“querying mongo source”,“field”:“serviceRequestedTimestamp”,“datatype”:“string”,“startvalue”:“2020-04-14 00:00 :00.0000000 (GMT-04:00)”,“终值”:“2020-04-15 00:00:00.0000000 (GMT-04:00)”。出现错误:
  • 不知道 Teradata 我想我不能补充太多。但是,请注意将 Z 硬编码为文字,它与 UTC 的偏移量为 0,因此如果您的日期和时间不是 UTC,您将得到扭曲的结果。
  • 错误:原因:java.time.format.DateTimeParseException:文本'2020-04-14 00:00:00.00 00000 (GMT-04:00)' 无法在 java 的索引 10 处解析.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.j at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) java.time.LocalDateTime.parse(LocalDateTime.java:492)com.lmig.grm.us .dae.command.RateResponseCommand.run(RateResponseComma
  • 您的代码在 cmets 中不可读。您可以在问题中添加它或提出新问题。
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2014-08-10
  • 2020-04-24
相关资源
最近更新 更多