我正试图使用以下代码将机器的日期/时间转换为GMT时区:
DateFormat gmtFormat = new SimpleDateFormat("E MMM dd HH:mm:ss 'GMT' yyyy");
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
gmtFormat.setTimeZone(gmtTime);
System.out.println("Orginal Date : " + new Date());
String s= gmtFormat.format(new Date());
System.out.println("Converted Date As String: "+ s);
System.out.println("Converted Date As date object : " + gmtFormat.parse(s));
以上代码输出:
Orginal Date : Mon Apr 21 21:04:06 AST 2014
Converted Date As String: Mon Apr 21 18:04:06 GMT 2014
Converted Date As date object : Mon Apr 21 21:04:06 AST 2014
然而,当我使用解析函数将"Converted Date As String"解析为"Converted Date As Date object"时,我的问题是,但您可以注意到,日期更改为原始日期
为什么会发生这种情况?
当我做以下事情时,问题就解决了:
DateFormat gmtFormat = new SimpleDateFormat("E MMM dd HH:mm:ss 'GMT' yyyy");
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
gmtFormat.setTimeZone(gmtTime);
System.out.println("Orginal Date : " + new Date());
String s= gmtFormat.format(new Date());
System.out.println("Converted Date As String: "+ s);
// Just I added Local Time Zone Formatand I use it to call parse instead of gmtFormat
DateFormat LocalFormat = new SimpleDateFormat("E MMM dd HH:mm:ss 'GMT' yyyy");
System.out.println("Converted Date As date object : " + LocalFormat.parse(s));
我想知道为什么会发生这种情况>>本地格式是如何与解析函数相关的?有人知道为什么吗?
DateFormat.parse(String)
的返回值是java.util.Date
,它不保留任何关于时区或区域设置的信息。Date
本质上是一个围绕long
值的包装对象,该值表示自1970年1月1日00:00 GMT以来的毫秒数。当调用其toString()
方法时,默认实现会在本地系统的默认时区中呈现日期。
如果要创建一个同时存储时间戳和相关时区/区域设置的日期/时间表示,则应创建一个java.util.Calendar
对象(使用Calendar.getInstance(...)
并为其提供TimeZone
和/或Locale
,然后使用代表所需日期/时间的Date
对象设置与日历相关联的时间。