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

我遇到了以下问题,当我在虚拟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中拥有所有日期。 这很烦人,因为我不知道如何预测系统的行为方式,我不得不做无聊的测试并弄清楚如何改变它。

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

  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())); 

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

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

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

PreparedStatement st = con .prepareStatement(“insert into 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-%m-%Y’),?,?,?,?,?,?,?,?,?,?)“);

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

此行是日期

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

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

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