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

时间:2018-09-26 17:27:54

标签: java date datetime java-8

我正在尝试将格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"的字符串解析为LocalDateTime,如果日期是sundaysaturday,我想将日期更改为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

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

4 个答案:

答案 0 :(得分:3)

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

此代码段的输出为:

  

2018-09-24T12:30:10Z

它从字符串中获取日期,在这种情况下为9月22日,并且由于它是星期六,所以它确实将调整为下一个星期一。它不使用您的JVM的时区设置。

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

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

答案 1 :(得分:1)

尝试这个

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).format(formatter));

输出:

  

2018-09-24T12:30:10Z

答案 2 :(得分:1)

tl; dr

使用Instant,而不是LocalDateTime

Instant.parse( "2018-01-23T01:23:45.123456789Z" )

ISO 8601

  

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

您不能。或不应为此目的使用LocalDateTime

您的输入字符串为标准ISO 8601格式。最后的Z表示UTC,并发音为“ Zulu”。您永远不应忽略此字符,因为您似乎打算在其周围使用单引号引起来。

Instant

解析这样的字符串,例如Instant(UTC时刻)。

Instant instant = Instant.parse( "2018-01-23T01:23:45.123456789Z" ) ;

LocalDateTime

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

OffsetDateTime

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

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

ZonedDateTime

要通过某个地区(时区)的人们所使用的挂钟时间来查看Instant的瞬间,请应用ZoneId来获得{{1 }}对象。

ZonedDateTime

周末

要测试周末,请在ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdt = instant.atZone( z ) ; 中使用DayOfWeek枚举。

EnumSet

在任何给定时刻,日期都会在全球各地按时区变化。例如,法国巴黎午夜过后的几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。因此,如上所示,将Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SATURDAY ) ; 调整为适合您业务问题的时区。

通过从Instant中提取一个DayOfWeek枚举对象进行比较。

ZonedDateTime

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

DayOfWeek dow = zdt.getDayOfWeek() ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要ZonedDateTime target = zdt ; // Initialize. if( weekend.contains( dow ) ) { target = zdt.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ; // Move from one day to another. } 类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

转换为Instant时间。

System.out.println(dateTime.plusDays(2).toInstant(ZoneOffset.UTC)));