4

我需要编写一个接受 ajava.util.Date使用 JUST MATH (没有日期格式化程序,没有日历对象等)从中删除小时、分钟和毫秒的函数:

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

此方法的目的是从毫秒值中获取日期,不包含时间。

这是我到目前为止所拥有的:

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

问题是,这只删除了分钟和秒。我不知道如何删除小时。

如果我这样做milliseconds - (milliseconds%(1000*60*60*23)),那么它会回到前一天的 23:00 小时。

编辑:

这是一个替代解决方案:

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();
}

此解决方案是否会受到我的应用程序的客户端/服务器端之间的时区差异的影响?

4

4 回答 4

13

一天有24小时。使用毫秒%(1000*60*60*24)。

于 2013-10-01T18:14:48.410 回答
2

根据您的定义,根本不可能。

毫秒时间戳表示从固定时间点(1970-01-01 00:00:00.000 UTC,如果我没记错的话)经过的毫秒数。如果不指定要转换到的时区,则无法将此时间戳转换为日期 + 时间。

因此,您只能针对特定时区将时间戳四舍五入,而不是一般情况下。因此,任何对 Date.getTime() 的摆弄而不考虑任何时区都保证只能在一个时区工作——你硬编码的那个。

帮自己一个忙,使用日历。

于 2013-10-01T18:38:27.350 回答
1

您可以使用 apache 的 commons lang DateUtils helper 实用程序类。

例如,如果您的日期时间为 2002 年 3 月 28 日 13:45:01.231,如果您使用 Calendar.HOUR 传递,它将返回 2002 年 3 月 28 日 13:00:00.000。如果这与 Calendar.MONTH 一起传递,它将返回 2002 年 3 月 1 日 0:00:00.000。

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

您可以在http://commons.apache.org/proper/commons-lang/下载 commons lang jar

于 2014-08-20T05:30:46.370 回答
0
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();

输入:1592283050000
输出:1592245800000

于 2020-07-13T13:39:39.157 回答