Java将Time对象(GMT)转​​换为String(GMT + 1)

时间:2016-01-04 10:45:22

标签: java time timezone simpledateformat

我尝试了以下代码,允许我将时间传递作为参数转换为一个小时以上的字符串(GMT + 1)。
但是我总是在我的对象Time中得到同样的时间

public static String getFormattedTimeLabel(final Time time) {
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(time.getTime());
    SimpleDateFormat sdf = new SimpleDateFormat("HH : mm");
    sdf.setCalendar(cal);
    sdf.setTimeZone(TimeZone.getDefault());
    return sdf.format(cal.getTime());
}    

有人知道怎么解决吗?

编辑:好的,最后我在控制器中创建了以下功能 我在简单日期格式中设置的时区是客户端恢复的时区,这要归功于HttpServletRequest。
您可以在代码后看到System.out的打印结果。

private Time getTimeLocal(Time requestTime) {
     Calendar cal = new GregorianCalendar();
     cal.setTimeInMillis(requestTime.getTime());
     SimpleDateFormat sdf = new SimpleDateFormat("HH : mm");
     sdf.setCalendar(cal);
     System.out.println(requestTime);
     sdf.setTimeZone(tz);
     System.out.println(tz.getID());
     String dt = sdf.format(cal.getTime());
     Date date = null;
    try {
        date = sdf.parse(dt);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(dt);
     return new Time(date.getTime());
}

10:00:00 //the Time object
Europe/Paris  // The id of the client timezone (GMT+1 for me)
10 : 00 //the date. the time printed is not correct it should be set with the timezone of the client so for me GMT+1 so 11:00:00

2 个答案:

答案 0 :(得分:3)

代码似乎正常工作。输出结果时,时间将显示为正确时区中的时间。尝试添加时区参数,如下所示:

public static String getFormattedTimeLabel(final Time time, String tzId) {
  Calendar cal = new GregorianCalendar();
  cal.setTimeInMillis(time.getTime());
  SimpleDateFormat sdf = new SimpleDateFormat("HH : mm");
  sdf.setCalendar(cal);
  sdf.setTimeZone(tzId == null ? TimeZone.getDefault() : TimeZone.getTimeZone(tzId));
  return sdf.format(cal.getTime());
}

并将其调用为:

Time time = new Time(System.currentTimeMillis());
System.out.println(getFormattedTimeLabel(time, null));
System.out.println(getFormattedTimeLabel(time, "UTC"));

给出以下结果(截至目前):

12 : 08
11 : 08

因为我在TZ GMT + 1,现在已经过了中午,结果是正确的。

BTW,打印时间对象如下:

System.out.println(time.toString());

给出:

12:08:16

即。它在默认时区默认格式化。

再次顺便说一句,该函数可以简化为不使用Calendar对象,如下所示:

public static String getFormattedTimeLabel(final Time time, String tzId) {
  SimpleDateFormat sdf = new SimpleDateFormat("HH : mm");
  sdf.setTimeZone(tzId == null ? TimeZone.getDefault() : TimeZone.getTimeZone(tzId));
  return sdf.format(time);
}

在SimpleDateFormat中设置时区就足够了。

答案 1 :(得分:0)

好的,我终于找到了解决方案,感谢这篇帖子Date TimeZone conversion in java?,并且所有人的帮助都参与了我的帖子。

我的最终代码是:

private Time getTimeLocal(Time requestTime) {
    String ret = Utils.getFormattedTimeLabel(requestTime);
    SimpleDateFormat sdfgmt = new SimpleDateFormat("HH : mm");
    sdfgmt.setTimeZone(TimeZone.getTimeZone("GMT"));

    SimpleDateFormat sdfmad = new SimpleDateFormat("HH : mm");
    sdfmad.setTimeZone(TimeZone.getTimeZone(tz.getID()));

    Date inptdate = null;
    try {
        inptdate = sdfgmt.parse(ret);
    } catch (ParseException e) {e.printStackTrace();}

    String localString = sdfmad.format(inptdate);
    try {
        inptdate = sdfmad.parse(localString);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return new Time(inptdate.getTime());
}