Add a workaround for a possible null offset ID.
This commit is contained in:
parent
b27b49e4f3
commit
c0d6c8aeb3
|
@ -1,10 +1,29 @@
|
|||
package org.schabi.newpipe.ktx
|
||||
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneId
|
||||
import java.time.ZoneOffset
|
||||
import java.time.temporal.ChronoField
|
||||
import java.util.Calendar
|
||||
import java.util.Date
|
||||
import java.util.GregorianCalendar
|
||||
import java.util.TimeZone
|
||||
|
||||
fun OffsetDateTime.toCalendar(zoneId: ZoneId = ZoneId.systemDefault()): Calendar {
|
||||
return GregorianCalendar.from(if (zoneId != offset) atZoneSameInstant(zoneId) else toZonedDateTime())
|
||||
// This method is a modified version of GregorianCalendar.from(ZonedDateTime).
|
||||
// Math.addExact() and Math.multiplyExact() are desugared even though lint displays a warning.
|
||||
@SuppressWarnings("NewApi")
|
||||
fun OffsetDateTime.toCalendar(): Calendar {
|
||||
val cal = GregorianCalendar(TimeZone.getTimeZone("UTC"))
|
||||
val offsetDateTimeUTC = withOffsetSameInstant(ZoneOffset.UTC)
|
||||
cal.gregorianChange = Date(Long.MIN_VALUE)
|
||||
cal.firstDayOfWeek = Calendar.MONDAY
|
||||
cal.minimalDaysInFirstWeek = 4
|
||||
try {
|
||||
cal.timeInMillis = Math.addExact(
|
||||
Math.multiplyExact(offsetDateTimeUTC.toEpochSecond(), 1000),
|
||||
offsetDateTimeUTC[ChronoField.MILLI_OF_SECOND].toLong()
|
||||
)
|
||||
} catch (ex: ArithmeticException) {
|
||||
throw IllegalArgumentException(ex)
|
||||
}
|
||||
return cal
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ import org.ocpsoft.prettytime.units.Decade;
|
|||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.extractor.ListExtractor;
|
||||
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
||||
import org.schabi.newpipe.ktx.OffsetDateTimeKt;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
|
@ -30,7 +31,6 @@ import java.time.format.DateTimeFormatter;
|
|||
import java.time.format.FormatStyle;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
|
@ -314,7 +314,7 @@ public final class Localization {
|
|||
}
|
||||
|
||||
public static String relativeTime(final OffsetDateTime offsetDateTime) {
|
||||
return relativeTime(GregorianCalendar.from(offsetDateTime.toZonedDateTime()));
|
||||
return relativeTime(OffsetDateTimeKt.toCalendar(offsetDateTime));
|
||||
}
|
||||
|
||||
public static String relativeTime(final Calendar calendarTime) {
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package org.schabi.newpipe.ktx
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import java.time.LocalDate
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneId
|
||||
import java.time.ZoneOffset
|
||||
import java.util.Calendar
|
||||
import java.util.TimeZone
|
||||
|
||||
class OffsetDateTimeToCalendarTest {
|
||||
@Test
|
||||
fun testRelativeTimeWithCurrentOffsetDateTime() {
|
||||
val calendar = LocalDate.of(2020, 1, 1).atStartOfDay().atOffset(ZoneOffset.UTC)
|
||||
.toCalendar()
|
||||
|
||||
assertEquals(2020, calendar[Calendar.YEAR])
|
||||
assertEquals(0, calendar[Calendar.MONTH])
|
||||
assertEquals(1, calendar[Calendar.DAY_OF_MONTH])
|
||||
assertEquals(0, calendar[Calendar.HOUR])
|
||||
assertEquals(0, calendar[Calendar.MINUTE])
|
||||
assertEquals(0, calendar[Calendar.SECOND])
|
||||
assertEquals(TimeZone.getTimeZone("UTC"), calendar.timeZone)
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException::class)
|
||||
fun testRelativeTimeWithFarOffOffsetDateTime() {
|
||||
OffsetDateTime.MAX.minusYears(1).toCalendar()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue