Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date JPA日期和时区混淆_Date_Jpa_Timezone - Fatal编程技术网

Date JPA日期和时区混淆

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 {

我在使用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 {
        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。