我使用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)
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)
ZoneId z = ZoneId.of( "America/Montreal" );\nlong secondsSinceEpoch = ZonedDateTime.now( z ).toLocalDate().atStartOfDay( z ).toEpochSecond() ;\nRun Code Online (Sandbox Code Playgroud)\n托米克接受的答案是正确的,但已经过时了。麻烦的旧遗留日期时间类已被 java.time 类取代。
\n正如该答案所建议的,您在开始一天时必须考虑时区。时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎的午夜过后几分钟是新的一天,而 Montr\xc3\xa9al Qu\xc3\xa9bec 中的 \xe2\x80\x9cyesterday\xe2\x80\x9d 仍然是新的一天。
\nZoneId z = ZoneId.of( "America/Montreal" );\nZonedDateTime zdt = ZonedDateTime.now( z );\nRun Code Online (Sandbox Code Playgroud)\n获得一天的第一刻需要经历LocalDate。该类LocalDate表示仅日期值,没有时间和时区。
LocalDate today = zdt.toLocalDate();\nZonedDateTime zdtTodayStart = today.atStartOfDay( z );\nRun Code Online (Sandbox Code Playgroud)\n请注意,我们让 java.time 确定一天的开始,而不是假设并硬编码00:00:00。由于夏令时 (DST) 和其他异常情况,这一天可能会在其他时间开始,例如01:00:00。
显然,unix timestamp你的意思是自 UTC 1970 年第一时刻以来的整秒数。该类ZonedDateTime有一个方法可以给你这个数字。请注意,这可能意味着数据丢失,因为ZonedDateTime可能只有几分之一秒,分辨率为纳秒。
long secondsSinceEpoch = zdtTodayStart.toEpochSecond();\nRun Code Online (Sandbox Code Playgroud)\njava.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
\n| 归档时间: |
|
| 查看次数: |
17709 次 |
| 最近记录: |