Question

I need to write a function that accepts a java.util.Date and removes the hours, minutes, and milliseconds from it USING JUST MATH (no Date formatters, no Calendar objects, etc.):

private Date getJustDateFrom(Date d) {
    //remove hours, minutes, and seconds, then return the date
}

The purpose of this method is to get the date from a millisecond value, without the time.

Here's what I have so far:

private Date getJustDateFrom(Date d) {
    long milliseconds = d.getTime();
    return new Date(milliseconds - (milliseconds%(1000*60*60)));
}

The problem is, this only removes minutes and seconds. I don't know how to remove hours.

If I do milliseconds - (milliseconds%(1000*60*60*23)), then it goes back to 23:00 hrs on the previous day.

EDIT:

Here's an alternative solution:

public static Date getJustDateFrom(Date d) {
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.set(Calendar.HOUR_OF_DAY, 0);
    c.set(Calendar.MINUTE, 0);
    return c.getTime();
}

Will this solution be affected by time zone differences between the client/server sides of my app?

Was it helpful?

Solution

There are 24 hours in a day. Use milliseconds%(1000*60*60*24).

OTHER TIPS

Simply not possible by your definition.

A millisecond timestamp represents milliseconds elapsed from a fixed point in time (1970-01-01 00:00:00.000 UTC, if I remember correctly). This timestamp can not be converted into a date + time without specifying the timezone to convert to.

So you can only round the timestamp to full days in respect to a specific timezone, not in general. So any fiddling with Date.getTime() and not taking into account any timezone is guaranteed to work in only one time zone - the one you hardcoded for.

Do yourself a favor and use a Calendar.

You can make use of apache's commons lang DateUtils helper utility class.

For example, if you had the datetime of 28 Mar 2002 13:45:01.231, if you passed with Calendar.HOUR, it would return 28 Mar 2002 13:00:00.000. If this was passed with Calendar.MONTH, it would return 1 Mar 2002 0:00:00.000.

Date newDate = DateUtils.truncate(new Date(1408338000000L), Calendar.DAY_OF_MONTH);

You can download commons lang jar at http://commons.apache.org/proper/commons-lang/

import java.sql.Date;


long dateInEpoch = 1_592_283_050_000L;

ZoneId defaultZoneId = ZoneId.systemDefault();
long currentDate = Date
        .from(new Date(dateInEpoch)
                .toLocalDate()
                .atStartOfDay(defaultZoneId)
                .toInstant())
        .getTime();

input : 1592283050000
output: 1592245800000

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top