我是Java的新手。我有一个在美国的 godaddy 服务器上运行的 Web 应用程序。
问题是当我们在任何地方使用该应用程序时,我们需要使用数据库中的相应时间戳更新日期。更新时,它存储为 MST 格式日期而不是 IST 格式(当我从印度尝试时)。让我知道我该如何解决这个问题。
提前谢谢。
我的代码如下。
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
f.setTimeZone(TimeZone.getTimeZone("IST"));
String date = f.format(new Date());
Date aptDate = formatter.parse(date);
System.Out.Print("The IST time is : "+ date);
在这里,我正在获取字符串格式的日期,我想转换为日期对象,然后存储在数据库中。
当我应用转换时,它会给出更早的日期。让我来错什么。
你的问题令人困惑。这里有一些指导方针可以重新定位你的思维。
您正在使用旧的日期时间类,这些类现在已被 Java 8 及更高版本中内置的 java.time 框架所淘汰。避免使用旧类,因为它们设计不佳、令人困惑且麻烦。
停止使用 3-4 个字母的代码,例如 IST
.你是说印度标准时间还是爱尔兰时间?这些代码既不是标准化的,也不是唯一的。从你的思维和代码中删除这些代码。以 continent/region
的格式使用正确的时区名称。
使用 UTC 完成大部分工作、业务逻辑、数据交换、数据存储和数据库。仅当用户或数据接收器预期时才应用时区。
在数据库中定义列时使用日期时间类型。不要将日期时间值存储为字符串。
使用 java.sql 类型将日期时间值传入和传出数据库。立即转换为 java.time 类型。最终,JDBC 驱动程序将更新为直接使用 java.time 类型。在那一天之前,使用添加到旧 java.sql 类中的新方法进行方便的转换。
Instant
是时间轴上的一个时刻,采用 UTC 格式。
Instant now = Instant.now();
转换为 java.sql.Timestamp 以写入数据库。
java.sql.Timestamp ts = java.sql.Timestamp.from( now );
到另一个方向,为了检索,从java.sql转换为java.time。
Instant instant = myJavaSqlTimestamp.toInstant();
请注意,对于数据库工作,我们不关心时区,因为所有方面的值都是UTC:Java,JDBC,SQL,数据库。
要查看某个位置的挂钟时间,请应用时区 ( ZoneId
) 生成ZonedDateTime
对象。
ZoneId zoneIdEdmonton = zoneId.of( "America/Edmonton" );
ZonedDateTime zdtEdmonton = ZonedDateTime.ofInstant( instant , zoneIdEdmonton );
您可以应用另一个时区。请注意,java.time 使用不可变的对象。新对象产生于旧对象,而不是更改("改变")原始对象。在此示例中,zdtEdmonton
对象生成zdtKolkata
对象。
ZoneId zoneIdKolkata = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdtKolkata = zdtEdmonton.withZoneSameInstant( zoneIdKolkata );