skip to Main Content

I’m developing an android application and I use GSON to get the data from the server, I’m working on both APIs of Facebook and Imgur and the same issue happens. How can I convert a date from milliseconds format to a human-readable format like for example 1584780523 and I want to convert it to any format, for example, 25, Mar 2020.

What I tried to do!

Get Data

@SerializedName("datetime")
    @Expose
    private long datetime;

    // setters and getters

In my adapter after getting DATETIME I parse it to a human-readable format

// Get Datetime. 
long getDate = data.getDatetime();

// Parse it in this format for example.
DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy HH:mm:ss:SSS Z");
Date result = new Date(getDate);

// Set Result (Human-Readable date)
date.setText(dateFormat.format(result));

But here is the problem! It gives me date like this

19 Jan 1970 09:54:00:533 +0200

Why the output at the 1970s. I saw something like that is the default output of Datetime? But in the same case, it gives me on the other items on my RecyclerView the same output but the last three digits changes!

Here what I’m asking!

1- Why we use (a lot of people use long instead of int?

2- Why the output gives me that and how can I fix this?

3- In other APIs like Youtube they use the regular DateTime why Facebook and Imgur changes them?

Note: I searched about my question for 3 days but I didn’t get any answers or relative questions on StackOverflow so, I asked here. All of them or most are for PHP and JavaScript I need an example in Java Android Studio

Thanks.

2

Answers


  1. Your 1584780523 value is in seconds, not milliseconds.

    long secondsSinceEpoch = 1584780523;
    long millisSinceEpoch = secondsSinceEpoch * 1000L;
    Date date = new Date(millisSinceEpoch);
    System.out.println(date);
    
    SimpleDateFormat fmt = new SimpleDateFormat("d, MMM yyyy", Locale.US);
    System.out.println(fmt.format(date));
    

    Output1

    Sat Mar 21 04:48:43 EDT 2020
    21, Mar 2020
    

    1) I’m in America/New_York time zone

    Login or Signup to reply.
  2. 1- Why we use (a lot of people use long instead of int?

    This is to avoid the year 2038 problem. While for example 1584780523 does fit into an int (a 32 bits signed integer), only dates and times up to January 19 2038 03:14:07 UTC can be represented. When writing a program today, we cannot be very sure that no one will ever use our code for dates and times after that point. So we use long instead. After the year 2000 problem (using two digit years leading to problems for dates in year 2000 and later) I guess the IT world has made a sort of a commitment not again to use date and time representations that have an end date within our lifetime.

    2- Why the output gives me that and how can I fix this?

    Andreas has already explained this part: Because you were treating your seconds as milliseconds. It’s a common mistake.

    BTW I recommend using a proven library for the conversion. The comments have already mentioned:

        Instant.ofEpochSecond(timestamp)
    

    While multiplying by 1000 works (on a long, not on an int because of overflow), doing your date and time conversions by hand is a bad habit to get into because they very often get more complicated than you think, and the risk of errors is great. Also using a library method with a nice name much better conveys why you are multiplying by 1000.

    3- In other APIs like Youtube they use the regular DateTime why
    Facebook and Imgur changes them?

    I guess it’s because they didn’t know better back when they designed the API. There’s an international standard for transmitting dates and times, ISO 8601, and using it efficiently prevents mistakes like yours, so this is what they should have used. Even if they have understood that later, now a lot of programs rely on the old way, so changing it now would also be risky.

    Links

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search