当前位置: 首页 > 知识库问答 >
问题:

带时区的数据库datetime到java.util.date转换

周鸿运
2023-03-14

现在,如果这个日期被转换到任何其他时区..假设GMT+5:30,我会得到意想不到的结果

若要修复上述问题...我编写了以下代码

 //Reading the DB time (which does not have timezone info)
 Date dbDate = entityObj.getDBUtcDate();

 //Setting GMT timezone to the date, without modifying the date
 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
 c.set(dbDate.getYear(), dbDate.getMonth(), dbDate.getDate()..., dbDate.getMinutes());

 Date utcDate = c.getTime();

使用上面的代码..我可以在UTC时区获得数据库存储日期,但当我使用以下逻辑转换到其他时区(例如GMT+5:30)时

Calendar outCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30"));
outCal.setTimeInMillis(utcDate.getTime());

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, outCal.get(Calendar.YEAR));
cal.set(Calendar.MONTH, outCal.get(Calendar.MONTH));
cal.set(Calendar.DAY_OF_MONTH, outCal.get(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, outCal.get(Calendar.HOUR_OF_DAY));                                              
cal.set(Calendar.MINUTE, outCal.get(Calendar.MINUTE));
cal.set(Calendar.SECOND, outCal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, outCal.get(Calendar.MILLISECOND));

//Converted date
Date pstTime = cal.getTime();
//Converted time mill seconds
long timeMilSec = pstTime.getTime();

ps:我希望输出是java.util.date/Calendar的形式,因为我需要在这个日期再做一次转换

请帮我解决这个问题

共有1个答案

丁俊爽
2023-03-14

Java中的日期没有时区。它们只是时间上的一个普遍瞬间。如果要在给定时区中显示日期,则只需使用用该时区初始化的DateFormat:

DateFormat df = DateFormat.getInstance();
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("The date in the database, in the UTC time zone, is " 
                   + df.format(date));

你不需要转换任何东西。日期格式基于通用即时it格式和您告诉它使用的时区打印适当的值。

同样,如果你想知道日期是星期一还是星期二,或者是1点钟还是2点钟,你需要首先选择一个时区,将它转换为日历,然后向日历询问信息:

Calendar cal = Calendar.getInstance(someTimeZone);
cal.setTime(date);
System.out.println("The day for the date stored in the database, for the time zone "
                   + someTimeZone
                   + " is " + cal.get(Calendar.DATE));
 类似资料:
  • 其他人有这个奇怪的问题吗?错误消息: 致命错误:未捕获异常“exception”,消息为“DateTime::\uuu construct():无法分析位置17(A)处的时间字符串(2016年1月18日美国/纽约凌晨00:00):在数据库中找不到时区 异常:DateTime::_构造():未能分析位置17(A)处的时间字符串(2016年1月18日美国/纽约凌晨00:00):在数据库中找不到时区 原

  • 我遇到了java的一个问题。时间类及其到DB类型的映射。我想存储Instant类型,但它的行为非常不直观。 我有基本的实体类: 现在,我将创建并持久化实体: Java中的数据符合预期-系统输出如下: 但是,DB中的数据不是。它们都存储为相同的值。所有列的默认类型都设置为TIMESTAMP。它们都被存储为应用程序JVM时区中的LocalDateTime。 我一点也不喜欢这样,这些类型之间没有区别,值

  • 这是我在申请表中得到的日期: 将psqlDate转换为joda的最佳方式是什么? [编辑] 我可以使用解析方法。它可以很好地使用时间戳,它可以使用T-分割日期和时间的信息。 这应该与良好的模式一起工作: 带有时区的PostgreSQL时间戳的正确模式是什么?

  • 在尝试将转换为时,我遇到以下异常。

  • 以下是我对CXF的问题。我有一个用CXF编写的SOAP1.2服务。该服务并不复杂,它基本上放置了一个XML int DB(Oracle11.x)。WSDL中的所有日期都定义为xsd:date。 哪些库/类可以用来封送/unmrashal xsd:date to dates而不带时间?还是必须编写自己的类来扩展XmlAdapter?

  • 尝试与数据库MySQL建立连接时出现此错误 与MySQL的连接是这样完成的: