Date JPA日期和时区混淆
我在使用JPA从数据库读取日期时遇到问题。我正在使用EclipseLink和PostgreSQL 我已经从一个CSV文件中填充了我的数据库,该文件的日期为字符串(格式为:Date JPA日期和时区混淆,date,jpa,timezone,Date,Jpa,Timezone,我在使用JPA从数据库读取日期时遇到问题。我正在使用EclipseLink和PostgreSQL 我已经从一个CSV文件中填充了我的数据库,该文件的日期为字符串(格式为:6/30/2009-23:59:56)。我使用以下snipet将其转换为日期对象: public static Date parseDate(String s){ DateFormat formatter = new SimpleDateFormat("d/M/yyyy-k:m:s"); try {
6/30/2009-23:59:56
)。我使用以下snipet将其转换为日期对象:
public static Date parseDate(String s){
DateFormat formatter = new SimpleDateFormat("d/M/yyyy-k:m:s");
try {
return new Date( ((java.util.Date)formatter.parse(s)).getTime() );
} catch (ParseException ex) {
Logger.getLogger(Type.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
日期已正确转换并按预期存储在数据库中。以下是如何将日期对象映射到数据库:
@Column(name="data_ts", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date dataTs;
当我试图从数据库中读取日期以在图表(Highcharts)中使用它时,问题似乎发生了。上面具有相同时间戳的记录被读取为:
Mon Jun 06 23:59:56 BRT 2011
其时间戳为1307415596000
请注意,它是在巴西时间(+3h),因此时间戳(从GMT计算)偏移了3小时。绘制完成后,时间戳变为指向07/06/2011 02:59:56
下面是一个例子:
List<TimedataEnt> timeData = currentWellsite.getTimeData();
String debug = timeData.get(timeData.size()-1).getDataTs().toString() + ">>>" + timeData.get(timeData.size()-1).getDataTs().getTime();
List timeData=currentWellsite.getTimeData();
String debug=timeData.get(timeData.size()-1).getDataTs().toString()+“>>>”+timeData.get(timeData.size()-1).getDataTs().getTime();
其中currentWellsite是和JPA实体,并且getDataTs()
返回一个java.util.Date对象。
字符串原来是“Tue Jun 30 23:59:56 BRT 2009>>1246417196000”
如何告诉JPA不要转换从数据库读取的时间戳?您的日期是
6/30/2009-23:59:56
。我读到2009年6月30日23:59:56。因此,解析它的格式应该是M/d/yyyy HH:mm:ss
或M/d/yyyy kk:mm:ss
(取决于你的时间是从1到24还是从0到23)。但绝对不是d/M/yyy-k:M:s
:月早于日
而且,时间戳没有任何时区。这是一个普遍的时间瞬间。只有当你显示它的值时,时区才是重要的,因为你必须选择使用哪个时区来显示时间。使用设置了适当时区的日期格式来显示时间戳。您的日期是
6/30/2009-23:59:56
。我读到2009年6月30日23:59:56。因此,解析它的格式应该是M/d/yyyy HH:mm:ss
或M/d/yyyy kk:mm:ss
(取决于你的时间是从1到24还是从0到23)。但绝对不是d/M/yyy-k:M:s
:月早于日
而且,时间戳没有任何时区。这是一个普遍的时间瞬间。只有当你显示它的值时,时区才是重要的,因为你必须选择使用哪个时区来显示时间。使用带有适当时区设置的DateFormat来显示时间戳。您的问题似乎是将时间戳(没有时区)存储到java.util.Date(有时区偏移)中 如果您想控制时区的设置方式,请将时间戳存储为java.sql.Timestamp,或者使用您自己的@Converter
一般来说,Java中应该使用Calendar,而不是Java.util.Date,这在很大程度上是不推荐的。日历也有时区,所以您可能会遇到类似的问题。您的问题似乎是将时间戳(没有时区)存储到java.util.Date(有时区偏移)中 如果您想控制时区的设置方式,请将时间戳存储为java.sql.Timestamp,或者使用您自己的@Converter
一般来说,Java中应该使用Calendar,而不是Java.util.Date,这在很大程度上是不推荐的。日历也有时区,所以您可能会遇到类似的问题。如前所述,日期和时间戳不考虑时区。这个问题似乎是因为Java认为它从数据库读取的时间是当前的默认时区 因此,如果数据库包含
2011-04-04 14:00:00
,而我的当前时区为+3,则将其分配给java Date将生成2011-04-04 14:00:00 BRT时间(+3)
,时间戳移动了3小时(因为时间戳是从UTC计算出来的)
通过获取计算的时间戳解决了此问题:
long ts = myDate().getTime() + TimeZone.getDefault().getRawOffset();
重要的是,
getRawOffset()
没有考虑夏令时。为此,请使用getOffset()
如上所述,日期和时间戳不考虑时区。这个问题似乎是因为Java认为它从数据库读取的时间是当前的默认时区
因此,如果数据库包含2011-04-04 14:00:00
,而我的当前时区为+3,则将其分配给java Date将生成2011-04-04 14:00:00 BRT时间(+3)
,时间戳移动了3小时(因为时间戳是从UTC计算出来的)
通过获取计算的时间戳解决了此问题:
long ts = myDate().getTime() + TimeZone.getDefault().getRawOffset();
重要的是,
getRawOffset()
没有考虑夏令时。为此,请使用getOffset()
Hi。谢谢你的回答。pasing formart确实错了(谢谢!),但问题仍然存在。正如我试图澄清的那样,我并没有用DateFormat显示日期。我将它转换为时间戳,并在图表上使用它。刚才在原始问题中添加了一个示例。嗨。谢谢你的回答。pasing formart确实错了(谢谢!),但问题仍然存在。正如我试图澄清的那样,我并没有用DateFormat显示日期。我将其转换为时间戳,并在图表上使用。在原始问题中添加了一个示例。java.util.Date没有时区。不幸的是,它还远没有被弃用。顺便说一句,时间戳扩展了java.util.Date。java.util.Date没有时区。不幸的是,它还远没有被弃用。顺便说一句,时间戳扩展了java.util.Date。