我如何使用日历和时区

时间:2013-12-11 08:58:29

标签: java date calendar

我正在使用DateCalendar类做一个示例,这是我的代码:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00Z");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 15);
Date date = cal.getTime();
TimeZone tz = TimeZone.getTimeZone("IST");


dateFormat.setTimeZone(tz);
String actual = dateFormat.format(date);

System.out.println(actual);

我希望结果为2013-09-01 12:15:00+0530,但值返回为2013-09-01 15:45:00+0530,我不知道原因。

5 个答案:

答案 0 :(得分:2)

我要动一些事情

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00Z");
TimeZone tz = TimeZone.getTimeZone("IST"); // <-- Move this here.

Calendar cal = Calendar.getInstance();
cal.setTimeZone(tz);                       // <-- So we can use it here.
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 15);
Date date = cal.getTime();
dateFormat.setTimeZone(tz);                // <-- And here.

然后您的代码会产生您的预期输出。那是

2013-09-01 12:15:00+0530

答案 1 :(得分:1)

package stackoverflow;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class StackOverflow {

    public static void main(String[] args) {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00Z");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 2013);
        cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
        cal.set(Calendar.DATE, 1);
        cal.set(Calendar.HOUR_OF_DAY, 12);
        cal.set(Calendar.MINUTE, 15);
        Date date = cal.getTime();
//        TimeZone tz = TimeZone.getTimeZone("IST");
      //  dateFormat.setTimeZone(tz);
        String actual = dateFormat.format(date);

        System.out.println(actual);
    }
}

给出:

run:
2013-09-01 12:15:00-0700
BUILD SUCCESSFUL (total time: 1 second)

我认为,这就是你想要的。时区正在改变时间。

答案 2 :(得分:1)

DateFormatCalendar取决于时区。 创建日期和格式时使用特定时区。

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:00Z");
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
cal.set(Calendar.YEAR, 2013);
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 15);
Date date = cal.getTime();
dateFormat.setTimeZone(TimeZone.getTimeZone("IST"));
String actual = dateFormat.format(date);

System.out.println(actual);

答案 3 :(得分:1)

您创建的日历实例也必须告知时区,即:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));

否则,它将占用您机器的时区。

答案 4 :(得分:0)

Joda-Time遵守。

我怀疑你直接的问题是你使用自己环境的时区实例化了Calendar实例,然后在那个已经存在的对象上切换了时区。这似乎是其他答案所指出的。

副作用是使用三个字母的代码来识别时区。它们不是标准的,有许多重复。在您的情况下,您的意思是IST是India Standard Time还是Irish Standard Time?请改用named time zone

但是你的更大问题是使用java.util.Date/Calendar类。他们是出了名的坏。

约达时间

这是相同类型的代码,但在Joda-Time 2.3中正确完成。

特别注意我没有在格式化程序上设置时区。 DateTime对象知道自己的时区。

    // © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
    // import org.joda.time.*;
    // import org.joda.time.format.*;

    DateTimeZone kolkataTimeZone = DateTimeZone.forID( "Asia/Kolkata" );
    DateTime kolkataDateTime = new DateTime( 2013, DateTimeConstants.SEPTEMBER, 1, 12, 15, 0, kolkataTimeZone );
    System.out.println( "kolkataDateTime: " + kolkataDateTime );

    // If you really cannot stand the 'T'.
    DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ssZ" );
    System.out.println( "kolkataDateTime sans 'T': " + formatter.print( kolkataDateTime ) );

跑步时......

kolkataDateTime: 2013-09-01T12:15:00.000+05:30
kolkataDateTime sans 'T': 2013-09-01 12:15:00+0530