Skip to content

Commit 96c4963

Browse files
Merge pull request #781 from Shopify/kieran-osgood/fix/#773-dates
Kieran osgood/fix/#773 dates
2 parents 5f11aa8 + 8bebb8b commit 96c4963

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

MobileBuy/buy3/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
`maven-publish`
66
}
77

8-
version = "2025.4.0"
8+
version = "2025.4.1"
99

1010
android {
1111
namespace = "com.shopify.buy3"

MobileBuy/buy3/src/main/java/com/shopify/buy3/Utils.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,35 @@
2626

2727
import java.text.ParseException;
2828
import java.text.SimpleDateFormat;
29+
import java.time.Instant;
2930
import java.util.Date;
3031
import java.util.Locale;
32+
import java.util.TimeZone;
3133

3234
final class Utils {
33-
private static final SimpleDateFormat DATE_TIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
34-
35-
static Date parseDateTime(String dateTime) {
36-
try {
37-
return DATE_TIME_FORMATTER.parse(dateTime);
38-
} catch (ParseException e) {
39-
return new Date();
40-
}
41-
}
42-
43-
private Utils() {
44-
}
35+
private static final SimpleDateFormat Z_DATE_TIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
36+
private static final SimpleDateFormat DATE_TIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
37+
private static final TimeZone timeZone = TimeZone.getTimeZone("UTC");
38+
39+
static Date parseDateTime(String dateTime) {
40+
DATE_TIME_FORMATTER.setTimeZone(timeZone);
41+
Z_DATE_TIME_FORMATTER.setTimeZone(timeZone);
42+
43+
try {
44+
return Z_DATE_TIME_FORMATTER.parse(dateTime);
45+
} catch (Exception ignored) { }
46+
47+
try {
48+
return DATE_TIME_FORMATTER.parse(dateTime);
49+
} catch (ParseException ignored) { }
50+
51+
try {
52+
return DATE_TIME_FORMATTER.parse(new Date().toString());
53+
} catch (ParseException e) {
54+
return new Date();
55+
}
56+
}
57+
58+
private Utils() {
59+
}
4560
}

MobileBuy/buy3/src/test/java/com/shopify/buy3/Utils.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
package com.shopify.buy3
2525

2626
import org.junit.Assert
27+
import org.junit.Test
28+
import java.time.ZoneOffset
2729

2830
internal fun checkForIllegalArgumentException(action: () -> Unit) {
2931
try {
@@ -32,4 +34,28 @@ internal fun checkForIllegalArgumentException(action: () -> Unit) {
3234
} catch (e: IllegalArgumentException) {
3335
// ignore
3436
}
37+
}
38+
39+
class UtilsTest {
40+
@Test
41+
fun testDateTimeParsingFormat() {
42+
val dateTimeStr = "2023-02-03T15:11:06"
43+
44+
Assert.assertEquals(
45+
"Parsed date should match expected timestamp",
46+
"2023-02-03T15:11:06Z",
47+
Utils.parseDateTime(dateTimeStr).toInstant().atZone(ZoneOffset.UTC).toString()
48+
)
49+
}
50+
51+
@Test
52+
fun test_Z_DateTimeParsingFormat() {
53+
val dateTimeStr = "2022-07-06T00:51:06Z"
54+
val dateTime = Utils.parseDateTime(dateTimeStr)
55+
Assert.assertEquals(
56+
"Parsing returns current time instead of actual date",
57+
dateTimeStr,
58+
dateTime.toInstant().atZone(ZoneOffset.UTC).toString()
59+
)
60+
}
3561
}

0 commit comments

Comments
 (0)