使用timezone java将字符串转换为适当的日期

min*_*inu 7 java timezone date

我正在使用它的时区日期,我想将它转换为另一个时区,例如我有Date'3/15/2013 3:01:53 PM',这是在TimeZone'GMT-06:00'.我想在'GMT-05:00'时区转换它.我有搜索很多,而且我对如何实际日期工作感到困惑.如何应用时区到目前为止.我尝试使用SimpleDateFormat,Calender以及偏移量.

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa XXX");
df.setTimeZone(TimeZone.getTimeZone("GMT")); 
Date dt = null;
try {
    dt = df.parse("3/15/2013 3:01:53 PM -06:00");
} catch (ParseException e) {
    e.printStackTrace();
} 
String newDateString = df.format(dt);
System.out.println(newDateString);
Run Code Online (Sandbox Code Playgroud)

它返回输出 03/15/2013 09:01:53 AM Z.我想它应该是 03/15/2013 09:01:53 PM Z,因为在'GMT-06:00'时区的时间,所以在GMT中得到时间应该是HH + 6.我希望Date以"yyyy-MM-dd HH:mm:ss"格式,其中HH在24小时内.请帮我举个例子.提前致谢.

编辑:

我正在使用SimpleDateFormat将字符串转换为日期

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa");
    Date dt = null;
    try {
        dt = df.parse("3/15/2013 3:01:53 PM");
    } catch (ParseException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

现在,正如你所说,我指定日历我的日期属于'GMT-06:00'时区并设定我的日期,

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-6"));
cal.setTime(dt);
Run Code Online (Sandbox Code Playgroud)

现在,我告诉日历我要在'GMT'中约会

cal.setTimeZone (TimeZone.getTimeZone("GMT"));
Run Code Online (Sandbox Code Playgroud)

的System.out.println(cal.getTime());

输出:

Fri Mar 15 03:01:53 CDT 2013
Run Code Online (Sandbox Code Playgroud)

如果我出错了,请告诉我.

Men*_*ild 9

您需要两个格式对象,一个用于解析,另一个用于打印,因为您使用两个不同的时区,请参见此处:

// h instead of H  because of AM/PM-format
DateFormat parseFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
Date dt = null;
try {
  dt = parseFormat.parse("3/15/2013 3:01:53 PM -06:00");
}catch (ParseException e) {
  e.printStackTrace();
} 

DateFormat printFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
printFormat.setTimeZone(TimeZone.getTimeZone("GMT-05")); 
String newDateString = printFormat.format(dt);
System.out.println(newDateString);
Run Code Online (Sandbox Code Playgroud)

输出:3/15/2013 04:01:53 PM -05:00

如果您想要HH:mm:ss(24小时格式),那么您只需更换

hh:mm:ss aaa 
Run Code Online (Sandbox Code Playgroud)

通过

HH:mm:ss
Run Code Online (Sandbox Code Playgroud)

在printFormat-pattern中.


评论问题的其他方面:

A java.util.Date没有内部时区,始终按规格引用UTC.您无法在此对象内更改它.格式化字符串可以进行时区转换,但正如我的代码示例所示(您希望转换为区域GMT-05).

然后问题切换到Date使用UTC时区(符号Z)以ISO格式打印对象的新要求.这可以通过将格式替换为"yyyy-MM-dd'T'HH:mm:ssXXX"并将printFormat的时区显式设置为GMT + 00来完成格式化.你应该澄清你真正想要的格式化输出.

关于java.util.GregorianCalendar:在此设置时区是以编程方式更改日历对象,因此它会影响方法调用calendar.get(Calendar.HOUR_OF_DAY).这与格式化无关!