16

我使用 unix 时间戳将时间/日期存储在数据库中。然后我想在某一天获取所有实例,因此我需要计算当天开始的时间戳以查询数据库。

我在 php 中做了类似的事情,方法是从日期对象传递 mktime 日/月/年的值并将小时和分钟设置为零。在 java/android 中似乎没有类似的功能(不推荐使用获取日期特定部分的功能)

任何人都可以对此提供一些指导吗?谢谢

编辑:

好的,所以我意识到这可能有效:

public static int startOfDay(Timestamp time) {
        Calendar cal = dateToCalendar(new Date(time.getTime()));
        cal.add(Calendar.HOUR_OF_DAY, -Calendar.HOUR_OF_DAY);
        cal.add(Calendar.MINUTE, -Calendar.MINUTE);
        cal.add(Calendar.SECOND, -Calendar.SECOND);
        Log.i("Time", cal.getTime().toString());        
        return (int) cal.getTimeInMillis()/1000;
}

但是,当我刚才运行它时,我得到了:

2012 年 12 月 15 日星期六 01:24:00 GMT

秒是正确的,但小时和分钟是错误的??

4

3 回答 3

47

在处理时间时,您应该始终考虑时区。您的数据库时间戳应始终存储在一个时区(例如 UTC)中。然后,您的计算应该考虑用户可以在不同的时区,并且他们可以更改时区。

如果您想在用户当前在其手机中设置的时区计算一天的开始时间。使用以下命令创建Calendar实例:

Calendar cal = Calendar.getInstance(); 

要获取特定时区的实例,请使用:

// use UTC time zone
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

然后设置一天的开始:

cal.setTime(time); // compute start of the day for the timestamp
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
于 2012-12-15T13:12:29.260 回答
9
public static int startOfDay(Timestamp time) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time.getTime());
    cal.set(Calendar.HOUR_OF_DAY, 0); //set hours to zero
    cal.set(Calendar.MINUTE, 0); // set minutes to zero
    cal.set(Calendar.SECOND, 0); //set seconds to zero
    Log.i("Time", cal.getTime().toString());        
    return (int) cal.getTimeInMillis()/1000;
}
于 2012-12-15T12:48:15.420 回答
5
于 2016-08-27T22:56:57.987 回答