首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取当前周和月的第一天?

问如何获取当前周和月的第一天?
EN

Stack Overflow用户
提问于 2010-05-30 08:27:12
回答 15查看 153.5K关注 0票数 79

我有几个事件的日期,用milliseconds1,表示,我想知道哪些事件在当前周和当前月份内,但我不知道如何获得运行周的第一天(日/月/年)并将其转换为毫秒,该月的第一天也是如此。

代码语言:javascript
复制
[1]Since January 1, 1970, 00:00:00 GMT
EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2010-05-30 18:26:41

本周,以毫秒为单位:

代码语言:javascript
复制
// 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());

这个月以毫秒为单位:

代码语言:javascript
复制
// 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());
票数 173
EN

Stack Overflow用户

发布于 2010-05-30 08:46:32

借助java.util.Calendar可以确定一周的第一天,如下所示:

代码语言:javascript
复制
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();

每月的第一天可以按如下方式确定:

代码语言:javascript
复制
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,这会让事情变得更简单:

代码语言:javascript
复制
DateTime dateTime = new DateTime(timestamp);
long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();

和

代码语言:javascript
复制
DateTime dateTime = new DateTime(timestamp);
long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();
票数 25
EN

Stack Overflow用户

发布于 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包含了一个方便的工厂方法。

代码语言:javascript
复制
long millisecondsSinceEpoch = 1446959825213L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );

millisecondsSinceEpoch: 1446959825213为instant: 2015-11-08T05:17:05.213Z

ZonedDateTime

要考虑当前周和当前月,我们需要应用特定的时区。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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类。

代码语言:javascript
复制
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美国/蒙特利尔

这个月也是一样。

代码语言:javascript
复制
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对象:

代码语言:javascript
复制
boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;

毫秒

我强烈建议不要从纪元开始以毫秒为单位进行日期-时间工作。这确实是date-time类在内部的工作方式,但我们有这样的类是有原因的。处理从纪元开始的计数很笨拙,因为人类无法理解这些值,因此调试和日志记录很困难,而且容易出错。正如我们已经看到的,不同的分辨率可能在起作用;旧的Java类和Joda-Time库使用毫秒,而Postgres等数据库使用微秒,而现在java.time使用纳秒。

您是将文本作为位来处理,还是让String、StringBuffer和StringBuilder等类来处理此类细节?

但是如果你坚持,从一个ZonedDateTime得到一个Instant,然后从它得到一个毫秒数。但请记住,此调用可能意味着数据丢失()。您的ZonedDateTime/Instant中可能存在的任何微秒或纳秒都将被截断(丢失)。

代码语言:javascript
复制
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类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java9添加了一些次要功能和fixes.

​

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

​

    • 更高版本的Android捆绑实现的java.time类。
    • 对于较早的Android (<26),项目适配 (如上所述)。请参阅.

​

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2937086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档