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
使用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
将格式为 "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)
要测试周末,请DayOfWeek在EnumSet.
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.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 的试验场。你可能在这里找到一些有用的类,比如Interval,YearWeek,YearQuarter,和更多。
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);\nRun Code Online (Sandbox Code Playgroud)\n\n该片段的输出是:
\n\n\n\n\n2018-09-24T12:30:10Z
\n
它从字符串中获取日期,在本例中为 9 月 22 日,由于那天是星期六,因此它会调整到下一个星期一。它不使用您的 JVM\xe2\x80\x99s 时区设置。
\n\n您的字符串采用 ISO 8601 格式,这是 java.time 中的类默认解析和生成的标准格式,因此无需通过任何DateTimeFormatter. 字符串中的Z表示 UTC(换句话说,距 UTC 的偏移量 0),因此将其解析为偏移量并解析为 anOffsetDateTime而不是 a LocalDateTime,以保留字符串中的所有信息。这也使得返回相同格式变得容易。
如果需要返回 a String,请使用dateTime.toString().