GrigorianCalendar: dump timezone as GMT offset
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 76879ff..52b4177 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -13,7 +13,8 @@
This is no backwards compatible change (2010-02-19)
</action>
<action dev="py4fun" type="fix" issue="49" due-to="obastard">
- Support GregorianCalendar (2010-02-19)
+ Support GregorianCalendar. Due to Daylight Saving Time parsing the timestamp with
+ a TimeZone cannot determine the exact time (2010-02-19)
</action>
<action dev="py4fun" type="fix" issue="51" due-to="johann.Werner">
Some Unicode characters are wrongly replaced by \x{fffd} during
diff --git a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
index 0539cc6..3c5082d 100644
--- a/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
+++ b/src/main/java/org/yaml/snakeyaml/representer/SafeRepresenter.java
@@ -255,9 +255,16 @@
if (TimeZone.getTimeZone("UTC").equals(calendar.getTimeZone())) {
buffer.append("Z");
} else {
- int offset = calendar.getTimeZone().getOffset(calendar.getTime().getTime());
- System.out.println(offset);
- buffer.append(calendar.getTimeZone().getID().substring(3));
+ // Get the Offset from GMT taking DST into account
+ int gmtOffset = calendar.getTimeZone().getOffset(calendar.get(Calendar.ERA),
+ calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK),
+ calendar.get(Calendar.MILLISECOND));
+ int minutesOffset = gmtOffset / (60 * 1000);
+ int hoursOffset = minutesOffset / 60;
+ int partOfHour = minutesOffset % 60;
+ buffer.append((hoursOffset > 0 ? "+" : "") + hoursOffset + ":"
+ + (partOfHour < 10 ? "0" + partOfHour : partOfHour));
}
return representScalar(getTag(data.getClass(), Tag.TIMESTAMP), buffer.toString(), null);
}
diff --git a/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java b/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
index 5ec4a31..47eac84 100644
--- a/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
+++ b/src/test/java/org/yaml/snakeyaml/issues/issue49/CalendarTest.java
@@ -27,7 +27,10 @@
import org.yaml.snakeyaml.Yaml;
public class CalendarTest extends TestCase {
- public void testDump() {
+ /**
+ * Daylight Saving Time is not taken into account
+ */
+ public void testDumpDstIgnored() {
CalendarBean bean = new CalendarBean();
bean.setName("lunch");
Calendar cal = Calendar.getInstance();
@@ -36,30 +39,63 @@
bean.setCalendar(cal);
JavaBeanDumper yaml = new JavaBeanDumper();
String output = yaml.dump(bean);
- System.out.println(output);
- assertEquals("calendar: 2001-09-08T17:46:40-08:00\nname: lunch\n", output);
+ // System.out.println(output);
+ assertEquals("calendar: 2001-09-08T17:46:40-8:00\nname: lunch\n", output);
//
JavaBeanLoader<CalendarBean> loader = new JavaBeanLoader<CalendarBean>(CalendarBean.class);
CalendarBean parsed = loader.load(output);
assertEquals(bean.getCalendar(), parsed.getCalendar());
}
- // TODO
- public void qtestDump2() {
+ /**
+ * Daylight Saving Time is in effect on this date/time in
+ * America/Los_Angeles Daylight<br/>
+ * Saving Time is not in effect on this date/time in GMT
+ */
+ public void testDumpDstIsNotTheSame() {
+ check(1000000000000L, "America/Los_Angeles", "Must be 7 hours difference.",
+ "2001-09-08T18:46:40-7:00");
+ }
+
+ /**
+ * Daylight Saving Time is not in effect on this date/time in
+ * America/Los_Angeles Daylight<br/>
+ * Saving Time is not in effect on this date/time in GMT
+ */
+ public void testDumpDstIsTheSame() {
+ check(1266833741374L, "America/Los_Angeles", "Must be 8 hours difference.",
+ "2010-02-22T02:15:41.374-8:00");
+ }
+
+ /**
+ * Test odd time zone
+ */
+ public void testNepal() {
+ check(1266833741374L, "Asia/Katmandu", "Must be 5:45 hours difference.",
+ "2010-02-22T16:00:41.374+5:45");
+ }
+
+ public void testMoreThen10hours() {
+ check(1266833741374L, "Asia/Kamchatka", "Must be 12 hours difference.",
+ "2010-02-22T22:15:41.374+12:00");
+ }
+
+ private void check(long time, String timeZone, String warning, String etalon) {
CalendarBean bean = new CalendarBean();
bean.setName("lunch");
Calendar cal = Calendar.getInstance();
- cal.setTime(new Date(1000000000000L));
- cal.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
+ cal.setTime(new Date(time));
+ cal.setTimeZone(TimeZone.getTimeZone(timeZone));
bean.setCalendar(cal);
JavaBeanDumper yaml = new JavaBeanDumper();
String output = yaml.dump(bean);
- System.out.println(output);
- assertEquals("calendar: 2001-09-08T17:46:40-08:00\nname: lunch\n", output);
+ // System.out.println(output);
+ assertEquals(warning, "calendar: " + etalon + "\nname: lunch\n", output);
//
JavaBeanLoader<CalendarBean> loader = new JavaBeanLoader<CalendarBean>(CalendarBean.class);
CalendarBean parsed = loader.load(output);
- assertEquals(bean.getCalendar(), parsed.getCalendar());
+ assertFalse("TimeZone must deviate.", bean.getCalendar().equals(parsed.getCalendar()));
+ assertEquals(bean.getCalendar().getTimeInMillis(), parsed.getCalendar().getTimeInMillis());
}
public void testLoadBean() {
@@ -87,5 +123,4 @@
Date date = (Date) yaml.load("2001-12-14t21:59:43.10-05:00");
assertEquals(date, calendar.getTime());
}
-
}