我是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);
这里我得到字符串格式日期,我想转换成日期对象然后存储在数据库中。
当我应用转换时,它会提供更早的日期。让我走错路。
答案 0 :(得分:0)
你的问题令人困惑。以下是重新定位思路的一些指导原则。
您正在使用旧的日期时间类,现在已经过时了Java 8及更高版本中内置的java.time框架。避免使用旧类,因为它们的设计很差,容易混淆和麻烦。
停止使用IST
等3-4个字母代码。你的意思是印度标准时间还是爱尔兰?这些代码既不标准也不唯一。从思考和代码中删除这些代码。以continent/region
的格式使用proper time zone names。
在UTC中完成大部分工作,业务逻辑,数据交换,数据存储和数据库。仅在用户或数据接收器预期时应用时区。
在数据库中定义列时使用date-time types。不要将日期时间值存储为字符串。
使用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();
请注意,对于数据库工作,我们不关心时区,因为所有方面的值都是所有的 :Java,JDBC,SQL,数据库。
要查看某个地区的wall-clock time,请应用时区(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 );