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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。