Java 如何使用“将字符串转换为日期对象”;日期格式;?

Java 如何使用“将字符串转换为日期对象”;日期格式;?,java,datetime,java.util.date,Java,Datetime,Java.util.date,我正在尝试使用以下代码将我的机器的日期/时间转换为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=

我正在尝试使用以下代码将我的机器的日期/时间转换为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
但是,当我使用parse函数将“转换的日期作为字符串”解析为“转换的日期作为日期对象”时,我遇到了问题,但是您可以注意到,日期更改为原始日期

为什么会这样


当我执行以下操作时,问题就解决了:

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(…)
并为其提供一个
时区和/或
区域设置
,然后使用表示所需日期/时间的
日期
对象设置与日历关联的时间。

我尝试使用calendar编写以下代码,但即使将时区设置为GMT,我仍获得了本地机器时间:SimpleDateFormat f=new SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”);Calendar-cal=Calendar.getInstance(TimeZone.getTimeZone(“GMT+00:00”);System.out.println(f.format(cal.getTime());System.out.println(f.parse(f.format(cal.getTime()));您还需要保留原始代码中的这一行,在原始代码中,您可以在格式化程序上设置时区:
gmtFormat.setTimeZone(gmtTime);
。请记住,无论何时调用
Calendar.getTime()
DateFormat.parse()
,返回值仍然是一个
日期
,因此,即使生成它的对象是时区感知的,
日期
本身只是一个长值(需要指定一个时区)。很抱歉打扰您,但是“日期本身只是一个长值(需要指定一个时区)”是什么意思