【问题标题】:Java: getting current Day of the Week valueJava:获取当前星期几的值
【发布时间】:2011-01-26 11:49:01
【问题描述】:

目前,我正在创建一个 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());
}

【问题讨论】:

  • 您在这里尝试做什么并不完全清楚。你的方法被命名为'get Sunday'。它为包含未指定开始日期的日历返回格式化的日期字符串,该日期向前移动了几天,计算方法是从一周的第一天减去一些东西。开始日期是什么时候?你想返回什么?
  • cal 在获取实例的 Calendar 类下创建。它在构造函数下初始化,我试图做的是将日期“3/11”对齐到“thurs”适当的日期。

标签: java calendar weekday


【解决方案1】:

您可以通过调用get()Calendar.DAY_OF_WEEK 来获取当前星期几

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

另外,虽然我不确定我是否完全理解你想要做的事情,但对我来说它看起来很可疑。 (例如cal 是什么?)

【讨论】:

【解决方案2】:

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 框架。大部分功能向后移植到 Java 6 和 7 (ThreeTen-Backport),并进一步适应 Android (ThreeTenABP)。

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

Instant instant = Instant.now();

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

使用ZoneId 表示时区。要求proper time zone name 格式为continent/region。切勿使用主流媒体中常见的 3-4 个字母缩写,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

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

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

DayOfWeek dow = DayOfWeek.from( zdt );

您可以询问DayOfWeek 对象。

根据ISO 8601 标准,您可以从 1 到 7 使用ask for a number,其中 1 是星期一,7 是星期日。但是不要在你的代码周围传递这个数字;而是传递 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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2011-06-06
    • 2013-02-25
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多