Skip to content

Commit 89c9032

Browse files
authored
Fix Timezone Crash when Timezone does not exist (#687)
* Fix timezone crash * Add UnitTesting * Remove sysout
1 parent 3f71b16 commit 89c9032

File tree

3 files changed

+128
-84
lines changed

3 files changed

+128
-84
lines changed

java/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
<dependency>
7373
<groupId>joda-time</groupId>
7474
<artifactId>joda-time</artifactId>
75-
<version>2.10.4</version>
75+
<version>2.12.2</version>
7676
</dependency>
7777
<dependency>
7878
<groupId>commons-net</groupId>

java/src/main/java/com/genexus/specific/java/GXutil.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,26 @@
1818

1919
import com.genexus.Application;
2020
import com.genexus.PrivateUtilities;
21-
import com.genexus.ModelContext;
2221
import com.genexus.common.interfaces.IExtensionGXutil;
2322
import com.genexus.db.IDataStoreProvider;
2423
import com.genexus.util.CacheAPI;
24+
import org.apache.logging.log4j.LogManager;
2525
import org.apache.logging.log4j.Logger;
26+
import org.joda.time.DateTimeZone;
2627

2728
public class GXutil implements IExtensionGXutil {
29+
private static Logger logger = LogManager.getLogger(GXutil.class);
2830

29-
private static org.joda.time.DateTimeZone Java2JodaTimeZone(TimeZone tz) {
30-
org.joda.time.DateTimeZone jodaTZ;
31+
private static DateTimeZone Java2JodaTimeZone(TimeZone tz) {
32+
DateTimeZone jodaTZ = DateTimeZone.getDefault();
3133
try {
32-
jodaTZ = org.joda.time.DateTimeZone.forID(tz.getID());
33-
} catch (IllegalArgumentException e) {
34-
jodaTZ = org.joda.time.DateTimeZone.forTimeZone(tz);
34+
jodaTZ = DateTimeZone.forID(tz.getID());
35+
} catch (IllegalArgumentException _) {
36+
try {
37+
jodaTZ = DateTimeZone.forTimeZone(tz);
38+
} catch (IllegalArgumentException e) {
39+
logger.error(String.format("Failed to find TimeZone: %s. Using default Timezone", tz.getID()), e);
40+
}
3541
}
3642
return jodaTZ;
3743
}
Lines changed: 115 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,129 @@
11
package com.genexus.util;
22

3-
import com.genexus.Application;
43
import com.genexus.CommonUtil;
54
import com.genexus.LocalUtil;
5+
import com.genexus.specific.java.Connect;
6+
import org.junit.Assert;
7+
import org.junit.Test;
68

9+
import java.text.DateFormat;
710
import java.text.ParseException;
11+
import java.text.SimpleDateFormat;
812
import java.util.Calendar;
913
import java.util.Date;
1014
import java.util.GregorianCalendar;
1115
import java.util.TimeZone;
1216

13-
import com.genexus.specific.java.Connect;
14-
import org.junit.Assert;
15-
import org.junit.Test;
16-
1717
public class TestDateMethods {
1818

19-
@Test
20-
public void testYearLimit(){
21-
Connect.init();
22-
LocalUtil localUtil = new LocalUtil('.', "MDY", "24", 30, "eng");
23-
Date testDate1 = CommonUtil.nullDate();
24-
Date testDate2 = CommonUtil.nullDate();
25-
26-
String pattern = "dd/MM/yy";
27-
28-
GXSimpleDateFormat df = new GXSimpleDateFormat(pattern);
29-
df.setTimeZone(TimeZone.getDefault());
30-
try
31-
{
32-
testDate1 = localUtil.applyYearLimit(df.parse("12/12/30"), pattern);
33-
testDate2 = localUtil.applyYearLimit(df.parse("08/05/76"), pattern);
34-
}
35-
catch (ParseException e)
36-
{
37-
38-
}
39-
Calendar calendar = GregorianCalendar.getInstance();
40-
calendar.setTime(testDate1);
41-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
42-
calendar.setTime(testDate2);
43-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1976);
44-
}
45-
46-
@Test
47-
public void testCtotex(){
48-
Connect.init();
49-
50-
LocalUtil localUtil = new LocalUtil('.', "MDY", "24", 30, "eng");
51-
Date testDate1 = CommonUtil.nullDate();
52-
Date testDate2 = CommonUtil.nullDate();
53-
Date testDate3 = CommonUtil.nullDate();
54-
try
55-
{
56-
testDate1 = localUtil.ctotex("1930-01-01T00:00", 0);
57-
testDate2 = localUtil.ctotex("2023-01-01T00:00:00", 0);
58-
testDate3 = localUtil.ctotex("2200-12-31T00:00:00.000", 0);
59-
}
60-
catch (Exception e)
61-
{ }
62-
63-
Calendar calendar = GregorianCalendar.getInstance();
64-
calendar.setTime(testDate1);
65-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
66-
calendar.setTime(testDate2);
67-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2023);
68-
calendar.setTime(testDate3);
69-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2200);
70-
71-
testDate1 = CommonUtil.nullDate();
72-
testDate2 = CommonUtil.nullDate();
73-
testDate3 = CommonUtil.nullDate();
74-
try
75-
{
76-
testDate1 = localUtil.ctotex("29-01-01", 0);
77-
testDate2 = localUtil.ctotex("30-01-01T00", 0);
78-
testDate3 = localUtil.ctotex("31-12-31T00:00", 0);
79-
}
80-
catch (Exception e)
81-
{ }
82-
83-
calendar = GregorianCalendar.getInstance();
84-
calendar.setTime(testDate1);
85-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2029);
86-
calendar.setTime(testDate2);
87-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
88-
calendar.setTime(testDate3);
89-
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1931);
90-
}
19+
@Test
20+
public void testYearLimit() {
21+
Connect.init();
22+
LocalUtil localUtil = new LocalUtil('.', "MDY", "24", 30, "eng");
23+
Date testDate1 = CommonUtil.nullDate();
24+
Date testDate2 = CommonUtil.nullDate();
25+
26+
String pattern = "dd/MM/yy";
27+
28+
GXSimpleDateFormat df = new GXSimpleDateFormat(pattern);
29+
df.setTimeZone(TimeZone.getDefault());
30+
try {
31+
testDate1 = localUtil.applyYearLimit(df.parse("12/12/30"), pattern);
32+
testDate2 = localUtil.applyYearLimit(df.parse("08/05/76"), pattern);
33+
} catch (ParseException e) {
34+
35+
}
36+
Calendar calendar = GregorianCalendar.getInstance();
37+
calendar.setTime(testDate1);
38+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
39+
calendar.setTime(testDate2);
40+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1976);
41+
}
42+
43+
@Test
44+
public void testCtotex() {
45+
Connect.init();
46+
47+
LocalUtil localUtil = new LocalUtil('.', "MDY", "24", 30, "eng");
48+
Date testDate1 = CommonUtil.nullDate();
49+
Date testDate2 = CommonUtil.nullDate();
50+
Date testDate3 = CommonUtil.nullDate();
51+
try {
52+
testDate1 = localUtil.ctotex("1930-01-01T00:00", 0);
53+
testDate2 = localUtil.ctotex("2023-01-01T00:00:00", 0);
54+
testDate3 = localUtil.ctotex("2200-12-31T00:00:00.000", 0);
55+
} catch (Exception e) {
56+
}
57+
58+
Calendar calendar = GregorianCalendar.getInstance();
59+
calendar.setTime(testDate1);
60+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
61+
calendar.setTime(testDate2);
62+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2023);
63+
calendar.setTime(testDate3);
64+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2200);
65+
66+
testDate1 = CommonUtil.nullDate();
67+
testDate2 = CommonUtil.nullDate();
68+
testDate3 = CommonUtil.nullDate();
69+
try {
70+
testDate1 = localUtil.ctotex("29-01-01", 0);
71+
testDate2 = localUtil.ctotex("30-01-01T00", 0);
72+
testDate3 = localUtil.ctotex("31-12-31T00:00", 0);
73+
} catch (Exception e) {
74+
}
75+
76+
calendar = GregorianCalendar.getInstance();
77+
calendar.setTime(testDate1);
78+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 2029);
79+
calendar.setTime(testDate2);
80+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1930);
81+
calendar.setTime(testDate3);
82+
Assert.assertTrue(calendar.get(Calendar.YEAR) == 1931);
83+
}
84+
85+
@Test
86+
public void testValidTimezone() {
87+
Connect.init();
88+
89+
String dateTime = "2023-03-22 15:00:00"; // input DateTime
90+
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
91+
92+
TimeZone timezone = TimeZone.getTimeZone("America/Montevideo");
93+
94+
try {
95+
Date mvdDate = dateFormat.parse(dateTime); // convert String to Date
96+
Date utcDate = CommonUtil.DateTimeToUTC(mvdDate, timezone);
97+
98+
long diff = utcDate.getTime() - mvdDate.getTime();
99+
long expectedDiff = 10800000;
100+
Assert.assertEquals("Timezone offset invalid", expectedDiff, diff);
101+
} catch (Exception e) {
102+
Assert.fail();
103+
}
104+
}
105+
106+
/**
107+
* DateTimeToUTC must not fail if the Timezone does not exists.
108+
*/
109+
@Test
110+
public void testInvalidTimezone() {
111+
Connect.init();
112+
113+
String dateTime = "2023-03-22 15:00:00"; // input DateTime
114+
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
115+
116+
TimeZone timezone = TimeZone.getTimeZone("America/DoesnotExists");
117+
118+
try {
119+
Date mvdDate = dateFormat.parse(dateTime); // convert String to Date
120+
Date utcDate = CommonUtil.DateTimeToUTC(mvdDate, timezone);
121+
122+
long diff = utcDate.getTime() - mvdDate.getTime();
123+
long expectedDiff = 0;
124+
Assert.assertEquals("Timezone offset invalid", expectedDiff, diff);
125+
} catch (Exception e) {
126+
Assert.fail();
127+
}
128+
}
91129
}

0 commit comments

Comments
 (0)