【问题标题】:how to convert LocalDate to a specific date time format [closed]如何将 LocalDate 转换为特定的日期时间格式 [关闭]
【发布时间】:2021-03-22 08:10:29
【问题描述】:

如何将 ISO_LOCAL_DATE 转换为日期时间格式:yyyy-MM-dd'T'HH:mm:ss.SSSZ in java

例如:给定日期:2016-01-25 到 2016-01-25T00:00:00.000+0100

【问题讨论】:

  • 2016-01-25 很可能是一个字符串。检查它来自的日期对象
  • 简单,只需使用字符串连接:s = "2016-01-25"; s += "T00:00:00.000+0100";
  • 您是否总是希望一天中的时间为 00:00:00.000?您希望 UTC 偏移量是多少(在您的示例中为 +0100)? 2016-01-25 是字符串吗? LocalDate?还有什么?
  • 可能不会,@blackgreen。 Java 和 JavaScript 是完全不同的语言。但是您是对的,那里有很多相关的有用问题,OP 将从使用他的搜索引擎中受益匪浅。

标签: java date-formatting java-time localdate isodate


【解决方案1】:

我假设有一个字符串,例如2016-01-25,并且您想要一个包含 JVM 默认时区中一天开始的字符串(问题中并不清楚)。我首先为您想要的格式定义一个格式化程序(它是 ISO 8601):

private static DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxx");

现在您的转换开始了:

    String isoLocalDateString = "2016-01-25";
    LocalDate date = LocalDate.parse(isoLocalDateString);
    ZonedDateTime dateTime = date.atStartOfDay(ZoneId.systemDefault());
    String dateTimeString = dateTime.format(formatter);
    System.out.println(dateTimeString);

在我的时区欧洲/哥本哈根运行时,此示例代码的输出是您所要求的:

2016-01-25T00:00:00.000+0100

在夏令时 (DST) 从一天的第一刻开始的极少数情况下,一天中的时间不会是 00:00:00.000。

对于使用ISO_LOCAL_DATE 进行解析,我们不需要指定格式化程序,因为该格式化程序是LocalDate.parse() 的默认设置。

综上所述,您通常不应该将日期从一种字符串格式转换为另一种字符串格式。在您的程序中,将日期保留为 LocalDate 对象。当你得到字符串输入时,解析成一个LocalDate。只有当你需要给出字符串输出时,例如在与另一个系统进行数据交换时,才格式化成所需格式的字符串。

链接: Wikipedia article: ISO 8601

【讨论】:

  • 谢谢,这就是我要找的东西
【解决方案2】:

LocalDate 上有多种方法可以做到这一点,包括:

  • Lo​​calDate::toDateTimeAtCurrentTime()
  • Lo​​calDate::toDateTimeAtStartOfDay()
  • Lo​​calDate::toDateTime(LocalTime)
  • Lo​​calDate::toDateTime( LocalTime , DateTimeZone )

【讨论】:

  • 我认为 OP 打算询问现代 Java 日期和时间 API java.time,我认为您的答案是关于 Joda-Time。仍然 +1 表明有不同的方法可以产生不同的结果。
【解决方案3】:

就像LocalDateTime localDateTime = yourLocalDate.atStartOfDay()一样简单

更新 添加时间戳很简单:

ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime = zdt = localDateTime.atZone(zoneId);

可以组合成

ZonedDateTime zdt = yourLocalDate.atStartOfDay().atZone(ZoneId.of("America/New_York"));

【讨论】:

  • 2016-01-25T00:00:00.000+0100OffsetDateTime,而不是 ZonedDateTime
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
相关资源
最近更新 更多