当我运行下面的代码将 xml 日期转换为 java 日期时,它在本地打印不同的值(CST),在运行相同代码的服务器中打印不同的值(UTC),这可能是什么原因?我怎样才能始终以 CST 格式打印我在本地获得的日期。
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.TimeZone;
public class Demo {
public static final TimeZone TIMEZONE = TimeZone.getTimeZone("America/Chicago");
public static Date convertDate(XMLGregorianCalendar value) {
if (value == null) {
return null;
} else {
if (value.getXMLSchemaType() == DatatypeConstants.DATE) {
return value.toGregorianCalendar().getTime();
} else {
return value.toGregorianCalendar(TIMEZONE, null, null).getTime();
}
}
}
public static void main(String[] args) {
try {
// Parse the XML date string into XMLGregorianCalendar
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar("2024-02-09T01:57:33.240-06:00");
// Convert XMLGregorianCalendar to Date
Date date = convertDate(xmlDate);
// Print the result
System.out.println("Date: " + date);
} catch (Exception e) {
e.printStackTrace();
}
}
}
日期:2024 年 2 月 9 日星期五 01:57:33 CST - 本地输出(Intellij - 我的 mac 时区 CST)
日期:2024 年 2 月 9 日星期五 07:57:33 GMT - 服务器输出(https://www.jdoodle.com/online-java-compiler)
您正在使用有严重缺陷的日期时间类,但现在已成为遗留问题。它们几年前就被 JSR 310 中定义的现代 java.time 类所取代。
它的众多缺陷之一是
java.util.Date#toString
对你撒谎。该方法插入 JVM 当前的默认时区,同时生成文本来表示对象的 UTC 值。
XMLGregorianCalendar
物体时,立即通过 java.time.ZonedDateTime
转换为现代替代品 java.util.GregorianCalendar
。
ZonedDateTime zdt = myXGregCal.toGregorianCalendar().toZonedDateTime() ;