我正在使用Date
和Calendar
类做一个示例,这是我的代码:
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
,我不知道原因。
答案 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)
DateFormat
和Calendar
取决于时区。
创建日期和格式时使用特定时区。
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