如何在Java中设置默认时区并控制日期存储在DB上的方式?

时间:2011-04-11 10:51:24

标签: java mysql hibernate time timezone

我遇到了以下问题,当我在虚拟Linux服务器上安装我的webapp战争时出现了这个问题。这是:我的服务器系统时间似乎是正确的,实际上shell上的输入日期是:

Mon Apr 11 11:47:30 CEST 2011

这是我的“挂钟时间”。即使mysql工作正常,如果我选择now(),我得到:

mysql> select now()
    -> ;
+---------------------+
| now()               |
+---------------------+
| 2011-04-11 11:52:57 |
+---------------------+
1 row in set (0.01 sec)

但是我的应用程序(Spring + hibernate on Java6 + tomcat 6)将使用GMT时区保存DB上的每个日期(并且时间与GMT的差异正确抵消,这很好)。现在问题是我用GMT显示所有日期,即使我这样做:

static final DateFormat format = new SimpleDateFormat(
            "dd/MM/yyyy 'alle' HH:mm", Locale.ITALY);

我没有得到正确偏移的小时数,但它们仍保留在GMT中,如果我在模式中放置Z(显示时区),它们会显示GMT。

在Windows下,我在mySQL的原生时区存储了日期值。所以在我开发的Windows机器上,我将在CEST中拥有所有日期。这很烦人,因为我不知道如何预测系统的行为方式,我不得不做无聊的测试并弄清楚如何改变它。

你有没有见过这个问题?怎么处理呢?

4 个答案:

答案 0 :(得分:2)

DateFormat确实支持时区概念。添加如下内容:

format.setTimeZone(TimeZone.getTimeZone("Europe/Rome");

答案 1 :(得分:1)

DateFormat不关心时区,只关心格式化。要更改为时区,您需要Calendar.setTimezone()

答案 2 :(得分:1)

  SimpleDateFormat sf1 = new SimpleDateFormat("dd/MM/yyyy 'alle' HH:mm:ss");
        sf1.setTimeZone(TimeZone.getTimeZone("Europe/Rome"));
        System.out.println(sf1.format(new Date()));

// List all Timezone
        System.out.println(Arrays.asList(TimeZone.getDefault()));

答案 3 :(得分:-1)

PreparedStatement st = con                         .prepareStatement(“插入knjiga_osisi(rb_knjiz,Inv_br,Naziv_os,datum_k,rb_pk,opis,ulaz,izlaz,stanje,osnovica_zam,otpis,sadasnjav,vrednost_pp,rashodovanav)值(?,?,?,STR_TO_DATE(?,'%) D-%间 - %Y'),,,,,,,,,,)“);??????????

这是java的代码。 Mysql - java欧洲日期格式

此行用于日期

STR_TO_DATE(?,'%d-%m-%Y')

你可以在mysql中测试日期行:

SELECT ID,DATE_FORMAT(日期,'%d-%M-%Y')FROM table1;