获取一天开始的时间戳

Hen*_*ons 16 android

我使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

周六12月15日01:24:00 GMT 2012

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

Tom*_*mik 41

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

如果要计算用户当前在手机中设置的时区中的一天的开始时间.用以下内容创建Calendar实例:

Calendar cal = Calendar.getInstance(); 
Run Code Online (Sandbox Code Playgroud)

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

// use UTC time zone
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Run Code Online (Sandbox Code Playgroud)

然后设置当天的开头:

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);
Run Code Online (Sandbox Code Playgroud)


tha*_*sma 7

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;
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

太长了;博士

\n
ZoneId z = ZoneId.of( "America/Montreal" );\nlong secondsSinceEpoch = ZonedDateTime.now( z ).toLocalDate().atStartOfDay( z ).toEpochSecond() ;\n
Run Code Online (Sandbox Code Playgroud)\n

细节

\n

托米克接受的答案是正确的,但已经过时了。麻烦的旧遗留日期时间类已被 java.time 类取代。

\n

正如该答案所建议的,您在开始一天时必须考虑时区。时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎的午夜过后几分钟是新的一天,而 Montr\xc3\xa9al Qu\xc3\xa9bec 中的 \xe2\x80\x9cyesterday\xe2\x80\x9d 仍然是新的一天。

\n
ZoneId z = ZoneId.of( "America/Montreal" );\nZonedDateTime zdt = ZonedDateTime.now( z );\n
Run Code Online (Sandbox Code Playgroud)\n

获得一天的第一刻需要经历LocalDate。该类LocalDate表示仅日期值,没有时间和时区。

\n
LocalDate today = zdt.toLocalDate();\nZonedDateTime zdtTodayStart = today.atStartOfDay( z );\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,我们让 java.time 确定一天的开始,而不是假设并硬编码00:00:00。由于夏令时 (DST) 和其他异常情况,这一天可能会在其他时间开始,例如01:00:00

\n

显然,unix timestamp你的意思是自 UTC 1970 年第一时刻以来的整秒数。该类ZonedDateTime有一个方法可以给你这个数字。请注意,这可能意味着数据丢失,因为ZonedDateTime可能只有几分之一秒,分辨率为纳秒。

\n
long secondsSinceEpoch = zdtTodayStart.toEpochSecond();\n
Run Code Online (Sandbox Code Playgroud)\n
\n

关于java.time

\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

\n

从哪里获取 java.time 类?

\n\n

  • 挑剔,它应该是 `ZonedDateTime.now( z ).toLocalDate().atStartOfDay(zoneId).toEpochSecond();` (2认同)