Java:获取当前日期值

目前,我正在创建一个java计划应用程序,我想知道如何在使用Calendar类获取一周的第一天时找到一周中的当前日期。

这是我在课堂上使用的方法,用于设置星期计划

public static String getSunday() { SimpleDateFormat d = new SimpleDateFormat(dayDate); Calendar specific = cal; specific.add(Calendar.DAY_OF_YEAR, (cal.getFirstDayOfWeek() - ??)); return d.format(specific.getTime()); } 

您可以通过使用Calendar.DAY_OF_WEEK调用get()get()当周的当前日期

 public int getTodaysDayOfWeek() { final Calendar c = Calendar.getInstance(); return c.get(Calendar.DAY_OF_WEEK); } 

而且,虽然我不确定我到底知道你想要做什么,但对我来说它看起来很可疑。 (例如什么?)

TL;博士

如何找到当天的当天

 DayOfWeek.from( LocalDate.now() ) 

设定一周的时间表

 LocalDate sunday = LocalDate.now() .with( TemporalAdjusters.nextOrSame( DayOfWeek.SUNDAY ) ) ; LocalDate monday = sunday.plusDays( 1 ) ; LocalDate tuesday = monday.plusDays( 1 ) ; … 

细节

问题和其他答案都使用过时的类。

旧的日期时间类设计糟糕,令人困惑,麻烦。 避免他们。

java.time

在Java 8及更高版本中,我们使用内置的java.time框架。 许多function都被后端移植到Java 6和7(ThreeTen-Backport),并进一步适应Android(ThreeTenABP)。

Instant表示UTC中的当前时刻,分辨率高达纳秒。

 Instant instant = Instant.now(); 

要获得星期几,我们必须确定日期。 时区对于确定日期至关重要,因为在任何特定时刻,日期可能在全球范围内变化。 例如,巴黎午夜过后几分钟是新的一天,而在蒙特利尔,它仍然是“昨天”。

使用ZoneId表示时区。 以continent/region格式询问适当的时区名称 。 永远不要使用主流媒体中常见的3-4个字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

使用方便的DayOfWeek枚举来确定星期几。

 DayOfWeek dow = DayOfWeek.from( zdt ); 

您可以询问DayOfWeek对象。

您可以要求 1到7 的数字 ,其中1表示星期一,7表示星期日符合ISO 8601标准。 但是不要在代码中传递这个数字; 而是通过DayOfWeek对象来享受类型安全和有保证的有效值的好处。

 int dowNumber = dow.getValue(); 

您可能需要文本,即星期几的名称。 让java.time自动将名称翻译成人类语言。 一种Locale物种,它的人类语言,也规定了使用的文化规范,如如何缩写和大写。 TextStyle枚举表示您想要的名称多长。

 Locale locale = Locale.CANADA_FRENCH; String output = dow.getDisplayName( TextStyle.FULL , locale ); 

要获得本周的开始,请询问上周一(或周日,无论如何),或者如果是星期一,请坚持今天。 使用TemporalAdjusters类中的TemporalAdjuster实现。

 LocalDate startOfWeek = zdt.toLocalDate().with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ); 

如果您需要日期时间而不是仅限日期,请让java.time获取当天的第一时刻(并不总是时间00:00:00 )。

 ZonedDateTime zdtWeekStart = startOfWeek.atStartOfDay( zoneId ); 

关于java.time

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

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

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。