I had this function that convert string type of date to unix timestamp, how to convert the result to timeInSeconds and offsetInNanos
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd-HH-mm-ss"); String dateTimeString = "2016-06-21-10-19-22"; LocalDate date = LocalDate.parse(dateTimeString, formatter); ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC")); Instant i = resultado.toInstant(); long timeInSeconds = i.getEpochSecond(); int nanoAdjustment = i.getNano(); System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds"); result is 1466467200 seconds 0 nanoseconds but the correct answer seems to be 1466504362 seconds
result is 1466467200 seconds 0 nanoseconds but the correct answer seems to be 1466504362 seconds
I think it convert “2016-06-21-10-19-22” to 2016-06-21T00:00:00+00:00, how to solve this problem, to convert both date with time and date without time to correct timeInSeconds?
You are absolutely correct, that is what it does, This is because in your new code in the question you are
LocalDate, which is a date without time of day, so the time of day in the string is being ignored.
atStartOfDay(). This makes sure that the time of day is set to — as the method name says — the start of the day, in this case in UTC, so 00:00:00 UTC.
To solve: instead parse into a
LocalDateTime so you get both date and time.
LocalDateTime date = LocalDateTime.parse(dateTimeString, formatter); OffsetDateTime resultado = date.atOffset(ZoneOffset.UTC);
The rest of the code is the same. Now the output is:
1466504362 seconds 0 nanoseconds
This is the result you said you expected. While a
ZonedDateTime would have worked too, for UTC it’s overkill, I recommend you use
OffsetDateTime as I am showing.
For how to parse a string that may or may not have time of day in it, see some of the questions that I link to at the bottom.
I suppose that by offset in nanos you meant nano adjustment, nanosecond part or nano of second (not offset from UTC). With java.time, the modern Java date and time API, it’s straightforward:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM dd yyyy HH:mm:ss.SSS zzz", Locale.ENGLISH); String dateTimeString = "Jun 13 2003 23:11:52.454 UTC"; Instant i = ZonedDateTime.parse(dateTimeString, formatter) .toInstant(); long timeInSeconds = i.getEpochSecond(); int nanoAdjustment = i.getNano(); System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");
1055545912 seconds 454000000 nanoseconds
I just did what deHaar said in the comments.