我有几个事件的日期,用milliseconds1,表示,我想知道哪些事件在当前周和当前月份内,但我不知道如何获得运行周的第一天(日/月/年)并将其转换为毫秒,该月的第一天也是如此。
[1]Since January 1, 1970, 00:00:00 GMT发布于 2010-05-30 18:26:41
本周,以毫秒为单位:
// get today and clear time of day
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
// get start of this week in milliseconds
cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
System.out.println("Start of this week: " + cal.getTime());
System.out.println("... in milliseconds: " + cal.getTimeInMillis());
// start of the next week
cal.add(Calendar.WEEK_OF_YEAR, 1);
System.out.println("Start of the next week: " + cal.getTime());
System.out.println("... in milliseconds: " + cal.getTimeInMillis());这个月以毫秒为单位:
// get today and clear time of day
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
// get start of the month
cal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Start of the month: " + cal.getTime());
System.out.println("... in milliseconds: " + cal.getTimeInMillis());
// get start of the next month
cal.add(Calendar.MONTH, 1);
System.out.println("Start of the next month: " + cal.getTime());
System.out.println("... in milliseconds: " + cal.getTimeInMillis());发布于 2010-05-30 08:46:32
借助java.util.Calendar可以确定一周的第一天,如下所示:
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeInMillis(timestamp);
while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) {
calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week.
}
long firstDayOfWeekTimestamp = calendar.getTimeInMillis();每月的第一天可以按如下方式确定:
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeInMillis(timestamp);
while (calendar.get(Calendar.DATE) > 1) {
calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of month.
}
long firstDayOfMonthTimestamp = calendar.getTimeInMillis();非常冗长,是的。
Java7将带来一个大大改进的日期和时间应用编程接口(JSR-310)。如果你还不能切换,那么你可以使用JodaTime,这会让事情变得更简单:
DateTime dateTime = new DateTime(timestamp);
long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();和
DateTime dateTime = new DateTime(timestamp);
long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();发布于 2015-11-08 13:48:28
java.time
Java8及更高版本中的java.time框架取代了旧的java.util.Date/.Calendar类。旧的类已经被证明是麻烦的、令人困惑的和有缺陷的。避开他们。
java.time框架的灵感来自非常成功的Joda-Time库,由JSR 310定义,由ThreeTen-Extra项目扩展,并在Tutorial中进行了解释。
Instant
在UTC中,Instant类表示时间线上的某个时刻。
java.time框架的分辨率为纳秒,或9位小数位秒。毫秒只是一小部分秒的3位数。因为millisecond resolution很常见,所以java.time包含了一个方便的工厂方法。
long millisecondsSinceEpoch = 1446959825213L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );millisecondsSinceEpoch: 1446959825213为instant: 2015-11-08T05:17:05.213Z
ZonedDateTime
要考虑当前周和当前月,我们需要应用特定的时区。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );In zoneId:美国/蒙特利尔即:2015-11-08T00:17:05.213-05:00美国/蒙特利尔
半开
在日期-时间工作中,我们通常使用半开放方法来定义时间跨度。开头是包含性的,结尾是排他性的。我们不是尝试确定一周(或一个月)结束的最后一秒,而是获得下一周(或一个月)的第一个时刻。因此,一周从周一的第一个时刻开始,一直持续到下个星期一的第一个时刻,但不包括在内。
让我们从一周的第一天开始,到最后一天。java.time框架包括一个工具,即with方法和ChronoField枚举。
默认情况下,java.time使用ISO 8601标准。因此星期一是一周的第一天(1),星期日是最后一天(7)。
ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week.
ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );当周运行时间:2015-11-02T00:17:05.213-05:00美国/蒙特利尔至2015-11-09T00:17:05.213-05:00美国/蒙特利尔
糟了!看看这些值的时间。我们想要一天中的第一个时刻。由于夏令时或其他异常情况,一天中的第一个时刻并不总是00:00:00.000。因此,我们应该让java.time代表我们进行调整。为此,我们必须遍历LocalDate类。
ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week.
firstOfWeek = firstOfWeek.toLocalDate ().atStartOfDay ( zoneId );
ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );该周的运行时间为:2015-11-02T00:00-05:00美国/蒙特利尔至2015-11-09T00:00-05:00美国/蒙特利尔
这个月也是一样。
ZonedDateTime firstOfMonth = zdt.with ( ChronoField.DAY_OF_MONTH , 1 );
firstOfMonth = firstOfMonth.toLocalDate ().atStartOfDay ( zoneId );
ZonedDateTime firstOfNextMonth = firstOfMonth.plusMonths ( 1 );当月运行时间为:2015-11-01T00:00-04:00美国/蒙特利尔至2015-12-01T00:00-05:00美国/蒙特利尔
YearMonth
查看一对时刻是否在同一月份的另一种方法是检查相同的YearMonth值。
例如,假设thisZdt和thatZdt都是ZonedDateTime对象:
boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;毫秒
我强烈建议不要从纪元开始以毫秒为单位进行日期-时间工作。这确实是date-time类在内部的工作方式,但我们有这样的类是有原因的。处理从纪元开始的计数很笨拙,因为人类无法理解这些值,因此调试和日志记录很困难,而且容易出错。正如我们已经看到的,不同的分辨率可能在起作用;旧的Java类和Joda-Time库使用毫秒,而Postgres等数据库使用微秒,而现在java.time使用纳秒。
您是将文本作为位来处理,还是让String、StringBuffer和StringBuilder等类来处理此类细节?
但是如果你坚持,从一个ZonedDateTime得到一个Instant,然后从它得到一个毫秒数。但请记住,此调用可能意味着数据丢失()。您的ZonedDateTime/Instant中可能存在的任何微秒或纳秒都将被截断(丢失)。
long millis = firstOfWeek.toInstant().toEpochMilli(); // Possible data loss.关于java.time
框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
现在在maintenance mode中的项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。
从哪里获取java.time类?
中的
https://stackoverflow.com/questions/2937086
复制相似问题