为什么 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.Date
和 SimpleDateFormat
切换到 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。
我正在从 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.Date
和 SimpleDateFormat
切换到 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。