Groovy中的难格式化日期

时间:2019-03-07 21:20:38

标签: java string date grails groovy

我在Groovy中格式化日期时遇到一些问题。我正在尝试将字符串转换回localdate,但效果不太好。...

DateTimeFormatter formatDates = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm");

LocalDate currentLocalDate = LocalDate.now();
// modify the local date to the previous day
LocalDate previousDateLocalDate = currentLocalDate.minusDays(1)
// cast localdates to strings
String startDateString = previousDateLocalDate.toString() + " 00:00"
String endDateString = previousDateLocalDate.toString() + " 23:59"
// cast strings to localdates
LocalDate startDateLocalDate = LocalDate.parse(startDateString, formatDates);

输出仅显示previousDateLocalDate变量中的内容: 2019-03-06

我不确定为什么会丢弃hh:mm。可能是我的格式,还是我的语法错误。任何想法将不胜感激。当我从当前日期减去一天的假期以设置其所需的格式,或者在创建LocalDate.now()时设置格式时,是否可能?

-谢谢

编辑1:我还要补充一点,minusDays可能会有所不同,因此可能有更好的方法来获取昨天的前一天,但在某些情况下,可能是7、11等...

2 个答案:

答案 0 :(得分:1)

明确指定时区

调用now时,应始终明确指定所需/期望的时区。在任何给定时刻,日期都会随时区在全球范围内变化。在日本东京可能是“明天”,而在摩洛哥卡萨布兰卡可能是“昨天”。省略区域时,JVM当前的默认区域在运行时被隐式应用-因此您的结果可能会有所不同。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;     // Or `ZoneId.systemDefault` if you actually want the JVM’s current default time zone.
LocalDate ld = LocalDate.now( z ) ;               // Capture the current date as seen in the wall-clock time used by the people of a particular region (a time zone). 

LocalDate

LocalDate类仅表示日期,没有日期,没有时区或UTC偏移量。

如果您希望将日期和日期结合在一起,请使用其他类别之一。

table showing modern versus legacy classes used to represent a moment

日期数学

java.time 类提供了plus…minus…方法,用于增加或减少时间跨度。

LocalDate yesterday = ld.minusDays( 1 ) ;

一天中的第一时刻

显然您要约会的第一时间。这里有几件事要理解。首先,需要一个时区。如上所述,新的一天在全球各地的不同时刻到来了。其次,不要假设一天从00:00:00开始。诸如夏令时(DST)之类的异常表示同一区域中某些日期的一天可能在其他时间开始,例如01:00:00。让 java.time 确定第一时刻。

ZonedDateTime zdt = ld.atStartOfDay( z ) ;        // Let java.time determine the first moment of the day.

半开放

显然您希望一天结束。跟踪一天的最后时刻是有问题的。例如,您的23:59文本将丢失当天最后一刻的任何时刻。

通常,更好的跟踪时间跨度的方法是半开放式方法,其中开始为包含,而结束为排他。因此,一天从一天的第一时刻开始,一直持续到(但不包括)第二天的第一时刻。

ZonedDateTime start = ld.atStartOfDay( z ) ;               // Start of today.
ZonedDateTime stop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Start of tomorrow.

DateTimeFormatter

要生成表示日期时间对象值的字符串,请使用DateTimeFormatter对象。我不会在这里介绍,因为covered many many many times already在堆栈溢出中已经存在。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm" ) ;
String output = zdt.format( f ) ;      // Generate text representing the value of this `ZonedDateTime` object.

请记住,日期时间对象没有“格式”,只有日期时间对象的值的文本表示形式才具有格式。不要将字符串对象与日期时间对象混淆。日期时间对象可以解析字符串,并且可以生成字符串,但本身不是字符串。

答案 1 :(得分:-1)

尝试使用此工具

keydown
import grails.gorm.transactions.Transactional
import org.springframework.stereotype.Component

import java.time.LocalDate
import java.time.Period
import java.time.ZoneId
import java.time.chrono.ChronoLocalDate
import java.time.chrono.Chronology
import java.time.chrono.MinguoChronology
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeFormatterBuilder
import java.time.format.DecimalStyle
import java.time.temporal.TemporalAccessor
import java.time.temporal.TemporalAdjusters