2

I'm making an application for Android in Android Studio with Java. I'm working with dates and times. I'm trying to produce a Unix timestamp from a custom given point in time. As an example, the following piece of code

LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZoneId zoneId = ZoneId.systemDefault();
int x = Math.toIntExact(aDateTime.atZone(zoneId).toEpochSecond());

produces a Unix timestamp 1619760600. However, when I enter this into any online converter, it produces a time of 04/30/2021 @ 5:30am (UTC). This is off by 3 hours from the original inserted time which is the exact amount in hours that my timezone differs from UTC00:00.

The problem seems to be my inability to understand timezones in Java. So my question is, how do I factor in the timezone correctly so that a correct UnixTimeStamp is produced?

3 Answers 3

2

You already have the right timestamp.

Timestamps represent instants of time. Timezones matter only when you want to display a timestamp in a user's local time. In your case, 04/30/2021 @ 5:30am (UTC) is the same instant of time as 8:30am in your local time. See if the online tool you found can display the timestamp in your local time in addition to UTC.

You should stop using int for the timestamp though and use long instead https://en.m.wikipedia.org/wiki/Year_2038_problem

If you expected to create a timestamp for 8:30 UTC instead of 8:30 local time, just use the UTC timezone when creating zoned datetime:

LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZoneId zoneId = ZoneOffset.UTC;
long x = aDateTime.atZone(zoneId).toEpochSecond();
Sign up to request clarification or add additional context in comments.

Comments

0

You can take advantage of java.time API (assuming you are using Java 8). Here is an example, taking the info you have provided:

LocalDateTime localDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZonedDateTime zdt = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
long millis = zdt.toInstant().toEpochMilli();

You can find more info here. Hope it helps

Comments

0

Do it as follows:

import java.time.LocalDateTime;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
        ZoneId zoneIdUTC = ZoneId.of("UTC");
        ZoneId myZoneId = ZoneId.systemDefault();
        LocalDateTime bDateTime = aDateTime.atZone(zoneIdUTC).withZoneSameInstant(myZoneId).toLocalDateTime();
        System.out.println(bDateTime.atZone(myZoneId).toEpochSecond());
    }
}

Output:

1619771400

Try it at https://www.unixtimestamp.com/index.php

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.