groovy 正在分析和格式化不同时区的日期

vdzxcuhz  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个如下格式的字符串:2021-10- 22 T21:43:00-05:00我知道它在UTC的时区-5:00。现在我想得到UTC格式的字符串dd:MMM:yyyy,这样我就可以将它与其他服务的响应进行比较。你能帮我处理代码吗?到目前为止,我无法解析它,因为我不熟悉日期的格式。尤其是时区部分。我尝试了

def date = '2021-10-22T21:43:00-05:00'
def timezone = TimeZone.getTimeZone("UTC");
def dateFormat = 'dd:MMM:yyyy'
Date.parse('yyyy-MM-dd',date.take(10)).format(dateFormat,timezone)

这样做的问题是我丢失了日期的时区部分,所以我不能更改它。我在ReadyApi软件中使用Groovy。我不是最先进的编码器,所以请帮助。感谢您的回答。:)

nhaq1z21

nhaq1z211#

tl;dr

OffsetDateTime
.parse( "2021-10-22T21:43:00-05:00" )
.toLocalDate()
.isEqual(
    LocalDate
    .parse( 
        "23:Jan:2023" , 
        DateTimeFormatter
        .ofPattern( "dd:MMM:uuuu" )
        .withLocale( Locale.US )
    )
)

详细信息

我有一个如下格式的字符串:2021-10- 22 T21:43:00-05:00我知道这是UTC的-5:00时区。
不,那不是时区,那是offset from UTC,UTC本初子午线前后的时-分-秒数。
时区的意义远不止于此。时区是特定地区的政治家决定的人们所使用的偏移量的过去、现在和未来变化的命名历史。时区的名称格式为Continent/Region,例如Europe/Paris。请参阅list
将输入解析为OffsetDateTime。这里是一些Java语法代码,因为我还没有学习Groovy。
您的输入字符串符合 java.time 类中默认使用的ISO 8601标准格式,因此无需定义格式模式。

String input = "2021-10-22T21:43:00-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

显然,您希望使用该值的日期部分来生成dd:MMM:yyyy的文本。
我必须说,这是一种相当时髦的格式,你可能想让数据的发布者了解只使用ISO 8601的好处。
定义格式模式。指定用于本地化中间月份缩写名称的区域设置。

Locale locale = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd:MMM:uuuu" ).withLocale( locale ) ;

产生文字。

String output = odt.format( f ) ;

但是如果您的目标是比较,我建议您 parse 另一个字符串,而不是 generate 用于比较的文本。

LocalDate target = LocalDate.parse( "23:Jan:2023" , f ) ;

从我们的OffsetDateTime对象odt中提取日期部分。

LocalDate ld = odt.toLocalDate() ;

比较一下。

boolean sameDate = ld.isEqual( target ) ;

相关问题