【发布时间】:2016-01-30 14:50:30
【问题描述】:
我在将日历对象转换为可读字符串时遇到了一个大问题。
实际上我使用 df.format(cal.getTime()) 来获取格式化的字符串,这不是很好,因为我从 cal.getTime() 获得的 Date 对象不受时区的影响。
请不要像“使用joda time”这样的cmets...
我正在寻找一种将日历对象直接转换为字符串的解决方案。
这些是我的格式化程序:
private DateFormat df = new SimpleDateFormat("HH:mm", Locale.GERMANY); // 13:42 Uhr
private DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMANY); // 14.04.2012
如果你们试一试这段代码,你会发现 Date 对象不受时区影响。
// this date is at wintertime
long milli = 1445945400000l; // CET - central european time
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(milli);
System.out.println(" ");
System.out.println("Kalender setTimeInMillis(" + milli + ");");
System.out.println("Daylight Time ? = " + cal.getTimeZone().useDaylightTime());
System.out.println("Date Time = " + cal.getTime());
System.out.println("Kalender Tag = " + cal.get(Calendar.DATE) + " Monat = " + (cal.get(Calendar.MONTH) + 1) + " Jahr = " + cal.get(Calendar.YEAR));
System.out.println("Kalender Uhrzeit = " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND));
cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
System.out.println(" ");
System.out.println("Kalender setTimeZone(TimeZone.getTimeZone(\"Europe/Berlin\");");
System.out.println("Daylight Time ? = " + cal.getTimeZone().useDaylightTime());
System.out.println("Date Time = " + cal.getTime());
System.out.println("Kalender Tag = " + cal.get(Calendar.DATE) + " Monat = " + (cal.get(Calendar.MONTH) + 1) + " Jahr = " + cal.get(Calendar.YEAR));
System.out.println("Kalender Uhrzeit = " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND));
// this date is at summertime
long milliS = 1445609700000l; // CEST - central european summertime
Calendar calS = Calendar.getInstance();
calS.setTimeInMillis(milliS);
System.out.println(" ");
System.out.println("Kalender setTimeInMillis(" + milliS + ");");
System.out.println("Daylight Time ? = " + calS.getTimeZone().useDaylightTime());
System.out.println("Date Time = " + calS.getTime());
System.out.println("Kalender Tag = " + calS.get(Calendar.DATE) + " Monat = " + (calS.get(Calendar.MONTH) + 1) + " Jahr = " + calS.get(Calendar.YEAR));
System.out.println("Kalender Uhrzeit = " + calS.get(Calendar.HOUR_OF_DAY) + ":" + calS.get(Calendar.MINUTE) + ":" + calS.get(Calendar.SECOND));
calS.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
System.out.println(" ");
System.out.println("Kalender setTimeZone(TimeZone.getTimeZone(\"Europe/Berlin\");");
System.out.println("Daylight Time ? = " + calS.getTimeZone().useDaylightTime());
System.out.println("Date Time = " + calS.getTime());
System.out.println("Kalender Tag = " + calS.get(Calendar.DATE) + " Monat = " + (calS.get(Calendar.MONTH) + 1) + " Jahr = " + calS.get(Calendar.YEAR));
System.out.println("Kalender Uhrzeit = " + calS.get(Calendar.HOUR_OF_DAY) + ":" + calS.get(Calendar.MINUTE) + ":" + calS.get(Calendar.SECOND));
输出
Kalender setTimeInMillis(1445945400000);
Daylight Time ? = false
Date Time** = Tue Oct 27 11:30:00 GMT 2015
Kalender Tag = 27 Monat = 10 Jahr = 2015
Kalender Uhrzeit = 11:30:0
Kalender setTimeZone(TimeZone.getTimeZone("Europe/Berlin");
Daylight Time ? = true
Date Time = Tue Oct 27 11:30:00 GMT 2015
Kalender Tag = 27 Monat = 10 Jahr = 2015
Kalender Uhrzeit = 12:30:0
Kalender setTimeInMillis(1445609700000);
Daylight Time ? = false
Date Time = Fri Oct 23 14:15:00 GMT 2015
Kalender Tag = 23 Monat = 10 Jahr = 2015
Kalender Uhrzeit = 14:15:0
Kalender setTimeZone(TimeZone.getTimeZone("Europe/Berlin");
Daylight Time ? = true
Date Time = Fri Oct 23 14:15:00 GMT 2015
Kalender Tag = 23 Monat = 10 Jahr = 2015
Kalender Uhrzeit = 16:15:0
【问题讨论】:
-
问题出在哪里或问题是什么?调用
df.format(calS.getTime())对我来说效果很好(两次都正确)。 -
为什么不“使用jodatime”?
标签: java date datetime calendar converter