我在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等...
答案 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偏移量。
如果您希望将日期和日期结合在一起,请使用其他类别之一。
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