LocalDate and ThreeTenABP
String dateString = "2019-11-27";
LocalDate date = LocalDate.parse(dateString);
int epochDay = (int) date.toEpochDay();
System.out.println(epochDay);
This snippet outputs:
18227
The documentation explains:
The Epoch Day count is a simple incrementing count of days where day 0
is 1970-01-01 (ISO).
So my suggestion is that this number is fine for feeding into your BarEntry
constructor.
toEpochDay()
returns a long
. If your constructor doesn’t accept a long
, convert to int
. In the code above I did a simple cast. The risk is that we will get a very wrong result in case of int
overflow for dates in the far future or the far past. I prefer to do a range check to avoid that:
long epochDayLong = date.toEpochDay();
if (epochDayLong < Integer.MIN_VALUE || epochDayLong > Integer.MAX_VALUE) {
throw new IllegalStateException("Date " + date + " is out of range");
}
int epochDay = (int) epochDayLong;
The result is the same as before. This check is the same check that the Math.toIntExact
method I mentioned in a comment does (available from Android API level 24).
I had converted this value 18227 to normal date and it gives date
of this year 1970/01/01 and in JSON it’s 2019-11-27 why? and
how should i correct it?
Let me guess, you effectively did new Date(18227)
. My suggestion is that you avoid the Date
class completely and stick to java.time, the modern Java date and time API. Why you got 1970 is: 18227 is a count of days since the epoch, and Date
counts milliseconds (since 00:00 UTC on the epoch day). So you got 00:00:18.227 UTC on that day. We already have a LocalDate
in the above code, so just use that.
System.out.println(date);
2019-11-27
Should you need to convert the opposite way, it’s easy when you know how:
LocalDate convertedBack = LocalDate.ofEpochDay(epochDay);
The result is a LocalDate
with the same value.
Question: Doesn’t java.time require Android API level 26?
java.time works nicely on both older and newer Android devices. It just requires at least Java 6.
- In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.
- In non-Android Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom).
- On (older) Android use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from
org.threeten.bp
with subpackages.
Links
- Documentation of
LocalDate.toEpochDay()
- Oracle tutorial: Date Time explaining how to use java.time.
- Java Specification Request (JSR) 310, where
java.time
was first described. - ThreeTen Backport project, the backport of
java.time
to Java 6 and 7 (ThreeTen for JSR-310). - ThreeTenABP, Android edition of ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project, with a very thorough explanation.
3
solved java.lang.NumberFormatException: For input string: “2019-11-27”