File tree 3 files changed +55
-5
lines changed
main/java/org/schabi/newpipe
test/java/org/schabi/newpipe/ktx
3 files changed +55
-5
lines changed Original file line number Diff line number Diff line change 1
1
package org.schabi.newpipe.ktx
2
2
3
3
import java.time.OffsetDateTime
4
- import java.time.ZoneId
4
+ import java.time.ZoneOffset
5
+ import java.time.temporal.ChronoField
5
6
import java.util.Calendar
7
+ import java.util.Date
6
8
import java.util.GregorianCalendar
9
+ import java.util.TimeZone
7
10
8
- fun OffsetDateTime.toCalendar (zoneId : ZoneId = ZoneId .systemDefault()): Calendar {
9
- return GregorianCalendar .from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime())
11
+ // This method is a modified version of GregorianCalendar.from(ZonedDateTime).
12
+ // Math.addExact() and Math.multiplyExact() are desugared even though lint displays a warning.
13
+ @SuppressWarnings(" NewApi" )
14
+ fun OffsetDateTime.toCalendar (): Calendar {
15
+ val cal = GregorianCalendar (TimeZone .getTimeZone(" UTC" ))
16
+ val offsetDateTimeUTC = withOffsetSameInstant(ZoneOffset .UTC )
17
+ cal.gregorianChange = Date (Long .MIN_VALUE )
18
+ cal.firstDayOfWeek = Calendar .MONDAY
19
+ cal.minimalDaysInFirstWeek = 4
20
+ try {
21
+ cal.timeInMillis = Math .addExact(
22
+ Math .multiplyExact(offsetDateTimeUTC.toEpochSecond(), 1000 ),
23
+ offsetDateTimeUTC[ChronoField .MILLI_OF_SECOND ].toLong()
24
+ )
25
+ } catch (ex: ArithmeticException ) {
26
+ throw IllegalArgumentException (ex)
27
+ }
28
+ return cal
10
29
}
Original file line number Diff line number Diff line change 20
20
import org .schabi .newpipe .R ;
21
21
import org .schabi .newpipe .extractor .ListExtractor ;
22
22
import org .schabi .newpipe .extractor .localization .ContentCountry ;
23
+ import org .schabi .newpipe .ktx .OffsetDateTimeKt ;
23
24
24
25
import java .math .BigDecimal ;
25
26
import java .math .RoundingMode ;
30
31
import java .time .format .FormatStyle ;
31
32
import java .util .Arrays ;
32
33
import java .util .Calendar ;
33
- import java .util .GregorianCalendar ;
34
34
import java .util .List ;
35
35
import java .util .Locale ;
36
36
@@ -314,7 +314,7 @@ private static void initPrettyTime(final Context context) {
314
314
}
315
315
316
316
public static String relativeTime (final OffsetDateTime offsetDateTime ) {
317
- return relativeTime (GregorianCalendar . from (offsetDateTime . toZonedDateTime () ));
317
+ return relativeTime (OffsetDateTimeKt . toCalendar (offsetDateTime ));
318
318
}
319
319
320
320
public static String relativeTime (final Calendar calendarTime ) {
Original file line number Diff line number Diff line change
1
+ package org.schabi.newpipe.ktx
2
+
3
+ import org.junit.Assert.assertEquals
4
+ import org.junit.Test
5
+ import java.time.LocalDate
6
+ import java.time.OffsetDateTime
7
+ import java.time.ZoneId
8
+ import java.time.ZoneOffset
9
+ import java.util.Calendar
10
+ import java.util.TimeZone
11
+
12
+ class OffsetDateTimeToCalendarTest {
13
+ @Test
14
+ fun testRelativeTimeWithCurrentOffsetDateTime () {
15
+ val calendar = LocalDate .of(2020 , 1 , 1 ).atStartOfDay().atOffset(ZoneOffset .UTC )
16
+ .toCalendar()
17
+
18
+ assertEquals(2020 , calendar[Calendar .YEAR ])
19
+ assertEquals(0 , calendar[Calendar .MONTH ])
20
+ assertEquals(1 , calendar[Calendar .DAY_OF_MONTH ])
21
+ assertEquals(0 , calendar[Calendar .HOUR ])
22
+ assertEquals(0 , calendar[Calendar .MINUTE ])
23
+ assertEquals(0 , calendar[Calendar .SECOND ])
24
+ assertEquals(TimeZone .getTimeZone(" UTC" ), calendar.timeZone)
25
+ }
26
+
27
+ @Test(expected = IllegalArgumentException ::class )
28
+ fun testRelativeTimeWithFarOffOffsetDateTime () {
29
+ OffsetDateTime .MAX .minusYears(1 ).toCalendar()
30
+ }
31
+ }
You can’t perform that action at this time.
0 commit comments