File tree Expand file tree Collapse file tree
main/java/org/schabi/newpipe
test/java/org/schabi/newpipe/ktx Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11package org.schabi.newpipe.ktx
22
33import java.time.OffsetDateTime
4- import java.time.ZoneId
4+ import java.time.ZoneOffset
5+ import java.time.temporal.ChronoField
56import java.util.Calendar
7+ import java.util.Date
68import java.util.GregorianCalendar
9+ import java.util.TimeZone
710
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
1029}
Original file line number Diff line number Diff line change 2020import org .schabi .newpipe .R ;
2121import org .schabi .newpipe .extractor .ListExtractor ;
2222import org .schabi .newpipe .extractor .localization .ContentCountry ;
23+ import org .schabi .newpipe .ktx .OffsetDateTimeKt ;
2324
2425import java .math .BigDecimal ;
2526import java .math .RoundingMode ;
3031import java .time .format .FormatStyle ;
3132import java .util .Arrays ;
3233import java .util .Calendar ;
33- import java .util .GregorianCalendar ;
3434import java .util .List ;
3535import java .util .Locale ;
3636
@@ -314,7 +314,7 @@ private static void initPrettyTime(final Context context) {
314314 }
315315
316316 public static String relativeTime (final OffsetDateTime offsetDateTime ) {
317- return relativeTime (GregorianCalendar . from (offsetDateTime . toZonedDateTime () ));
317+ return relativeTime (OffsetDateTimeKt . toCalendar (offsetDateTime ));
318318 }
319319
320320 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