为什么 groovy 在解析和格式化日期字符串后更改 hours/minutes?

Why is groovy changing the hours/minutes after parsing and formatting date string?

我正在从 SQL table 中提取日期字符串。从 Sql 中提取的日期字符串是...

2020-07-28 15:35:45.9375232 -05:00

当我尝试解析和格式化时,它返回的时间与传入的时间不同。

方法一:

String record = data.getValue(4, 1) 
// returns "2020-07-28 15:43:16.5168174 -05:00" from SQL table
    
def formattedDate = Date.parse("yyyy-MM-dd HH:mm:ss.SSSSSSS XXX", record).format("yyyy-MM-dd'T'HH:mm:ss.SSS")
        log.logInfo("queried date = " + formattedDate)

Returns 2020-07-28T17:09:24.174

和方法 2:

def queriedDate2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSS XXX").parse(record)
    log.logInfo("queriedDate2= " + queriedDate2)

Returns Tue Jul 28 17:09:24 CDT 2020

任何人都可以帮助我了解发生了什么事吗?

可能 SimpleDateFormat 忽略给定日期时间字符串中的时区偏移(-5 小时)并在解析时应用 JVM 的时区。我建议您从过时且容易出错的 java.util.DateSimpleDateFormat 切换到 modern date-time API 以摆脱此类问题。

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Given date-time string
        String dateTimeStr = "2020-07-28 15:35:45.9375232 -05:00";

        // OffsetDateTime from the given date-time string
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr,
                DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSS XXX"));
        System.out.println(odt);

        // You can print it in different forms using DateTimeFormatter patterns e.g.
        System.out.println(DateTimeFormatter.ofPattern("MMM dd uuuu").format(odt));
        System.out.println(DateTimeFormatter.ofPattern("MMM dd uuuu HH:mm:ss.SSSSSSS ZZZZZ").format(odt));
        System.out.println(DateTimeFormatter.ofPattern("MM/uuuu/dd hh:mm:ss a").format(odt));
    }
}

输出:

2020-07-28T15:35:45.937523200-05:00
Jul 28 2020
Jul 28 2020 15:35:45.9375232 -05:00
07/2020/28 03:35:45 pm

你的

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSS XXX")

需要一个时区,例如GMT 为 XXX。您的返回值

"2020-07-28 15:43:16.5168174 -05:00"

似乎有 GMT 偏移量:-05:00 我猜想 .parse() 是错误的并且 returns 某种默认格式。

因此,建议使用 Arvind 建议的 OffsetDateTime。