如何将 LocalDateTime 转换为`"yyyy-MM-dd'T'HH:mm:ss'Z'"` 格式

Dea*_*ool 2 java datetime date java-8

我正在尝试将字符串的格式解析"yyyy-MM-dd'T'HH:mm:ss'Z'"LocalDateTime如果日期是sunday或者saturday我想将日期更改为monday相同格式并返回,我知道我可以通过使用添加天数plusDays

String str = "2018-09-22T12:30:10Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime.plusDays(2));  //2018-09-24T12:30:10
Run Code Online (Sandbox Code Playgroud)

但我想以格式返回 2018-09-24T12:30:10Z

Bas*_*que 8

tl;博士

使用Instant,不是LocalDateTime

Instant                                                // Represent a moment as seen in UTC (an offset of zero hours-minutes-seconds).
.parse( "2018-01-23T01:23:45.123456789Z" )             // Parse text in standard ISO 8601 format where the `Z` on the end means UTC.
.truncatedTo( java.time.temporal.ChronoUnit.SECONDS )  // Lop off any fractional second.
.plus(                                                 // Date-time math.
    Duration.ofDays( 2 )                               // Represent a span-of-time not attached to the timeline.
)                                                      // Returns another `Instant` object rather than altering the original.
.toString()                                            // Generate text in standard ISO 8601 format.
Run Code Online (Sandbox Code Playgroud)

2018-01-25T01:23:45Z

ISO 8601

将格式为 "yyyy-MM-dd'T'HH:mm:ss'Z'" 的字符串解析为 LocalDateTime

你不能。或不LocalDateTime应用于此目的。

您的输入字符串采用标准ISO 8601格式。在Z上月底表示UTC,发音为“祖鲁”。你永远不应该忽略这个字符,因为你似乎有意在它周围使用单引号。

Instant

将这样的字符串解析为 a Instant, a moment in UTC。

Instant instant = Instant.parse( "2018-01-23T01:23:45.123456789Z" ) ;
Run Code Online (Sandbox Code Playgroud)

LocalDateTime

LocalDateTime班不能代表一个时刻。它故意缺少任何时区或 UTC 偏移量的概念。这个类代表了大约 26-27 小时范围内的潜在时刻,全球目前使用的各个时区。

OffsetDateTime

要通过 JDBC 与数据库通信,请使用OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Run Code Online (Sandbox Code Playgroud)

ZonedDateTime

Instant通过某个地区(时区)的人们使用的挂钟时间的镜头来查看那个时刻,请应用 aZoneId来获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Run Code Online (Sandbox Code Playgroud)

周末

要测试周末,请DayOfWeekEnumSet.

Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SATURDAY ) ;
Run Code Online (Sandbox Code Playgroud)

对于任何给定时刻,日期在全球各地因时区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。因此,将您调整Instant到适合您的业务问题的时区,如上所示。

通过DayOfWeek从您的ZonedDateTime.

DayOfWeek dow = zdt.getDayOfWeek() ;
Run Code Online (Sandbox Code Playgroud)

比较一下是周末还是工作日。

ZonedDateTime target = zdt ;  // Initialize.
if( weekend.contains( dow ) ) {
    target = zdt.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ; // Move from one day to another.
}
Run Code Online (Sandbox Code Playgroud)

Java 中的日期时间类型表,现代和传统


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Ole*_*.V. 5

    String str = "2018-09-22T12:30:10Z";\n    OffsetDateTime dateTime = OffsetDateTime.parse(str);\n    DayOfWeek dow = dateTime.getDayOfWeek();\n    if (dow.equals(DayOfWeek.SATURDAY) || dow.equals(DayOfWeek.SUNDAY)) {\n        dateTime = dateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY));\n    }\n    System.out.println(dateTime);\n
Run Code Online (Sandbox Code Playgroud)\n\n

该片段的输出是:

\n\n
\n

2018-09-24T12:30:10Z

\n
\n\n

它从字符串中获取日期,在本例中为 9 月 22 日,由于那天是星期六,因此它会调整到下一个星期一。它不使用您的 JVM\xe2\x80\x99s 时区设置。

\n\n

您的字符串采用 ISO 8601 格式,这是 java.time 中的类默认解析和生成的标准格式,因此无需通过任何DateTimeFormatter. 字符串中的Z表示 UTC(换句话说,距 UTC 的偏移量 0),因此将其解析为偏移量并解析为 anOffsetDateTime而不是 a LocalDateTime,以保留字符串中的所有信息。这也使得返回相同格式变得容易。

\n\n

如果需要返回 a String,请使用dateTime.toString().

\n