2

在java中,我需要从格式的字符串中创建一个日历对象:

yyyy-MM-dd'T'HH:mm:ss

此字符串将始终设置为 GMT 时间。所以这是我的代码:

    public static Calendar dateDecode(String dateString) throws ParseException
{
    TimeZone t = TimeZone.getTimeZone("GMT");
    Calendar cal = Calendar.getInstance(t);
    date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date d = date.parse(dateString);
    cal.setTime(d);
    return cal;
}

进而:

Calendar cal = Calendar.getInstance();
    try
    {
        cal = dateDecode("2002-05-30T09:30:10");
    } catch (ParseException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    int month =  cal.get(Calendar.MONTH)+1;

我得到以下输出:

Timezone: GMT+00:00 date: 2002-5-30 time: 7:30:10

正如您所看到的那样,这是错误的,因为提供的时间是格林威治标准时间而不是欧洲中部时间。我认为发生的情况是它认为提供的时间是 CET(这是我当前的时区),因此将时间从 CET 转换为 GMT,因此从最终结果中减去两个小时。

谁能帮我解决这个问题?

谢谢

顺便说一句:出于不同的原因,我不想使用 JodaTime。

4

2 回答 2

4

这里有一些代码可以帮助您在解析它们之前设置时区:

// sdf contains a Calendar object with the default timezone.
Date date = new Date();
String formatPattern = ....;
SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);

TimeZone T1;
TimeZone T2;
....
....
// set the Calendar of sdf to timezone T1
sdf.setTimeZone(T1);
System.out.println(sdf.format(date));

// set the Calendar of sdf to timezone T2
sdf.setTimeZone(T2);
System.out.println(sdf.format(date));

// Use the 'calOfT2' instance-methods to get specific info
// about the time-of-day for date 'date' in timezone T2.
Calendar calOfT2 = sdf.getCalendar();

我发现的另一个类似问题也可能有帮助:How to set default time zone in Java and control the way date are stored on DB?

编辑:

这里也是关于 Java 和日期的一个很棒的教程:http ://www.tutorialspoint.com/java/java_date_time.htm

于 2012-07-03T10:50:23.747 回答
1
于 2017-02-21T03:30:46.057 回答