当前位置: 首页 > 知识库问答 >
问题:

通过指定星期几获取下一个日期

程仲卿
2023-03-14

我需要使用日历来实现这个方法,基本上我得到了一周中的具体日期(1,2,3),每个int代表一周中的一天(周一,周二),不是按这个顺序,但逻辑是这样的。

我需要的是获取一周中第二天的日期,假设今天是周一,用户选择Wednesday,我需要获取下周三的日期。

目前我的逻辑是:

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                dateMatch = calendar.getTime();

day of week是从slidePicker传递过来的,代表一周中的特定日期,如果我把Wednesday放在他给我的6上,那么这一天就不起作用了

共有2个答案

益阳平
2023-03-14

今天之后的下一个星期三,如果已经是星期三,就坚持今天的日期。

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )

使用现代java.time类取代了麻烦的旧旧日期时间类,例如Calendar

使用DayOfWeekenum对象来表示星期一和星期天。使用智能对象而不是哑整数来表示一周中的某一天。使代码更加自文档化,确保有效值,并提供类型安全。

LocalDate类表示一个只包含日期的值,不包含一天中的时间和时区。

时区对确定日期至关重要。在任何一个特定的时刻,世界各地的日期因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克山仍然是“昨天”。

如果未指定时区,JVM将隐式应用其当前默认时区。默认值可能随时发生变化,因此结果可能会有所不同。最好将所需/预期时区明确指定为参数。

大陆/地区格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

使用TemporalAdouner实现,例如TemporalAdjusters.nextOr同类移动到另一个日期。

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
LocalDate nextOrSameWednesday = today.with( ta ) ;

如果使用“时刻”,请使用ZonedDateTime类,而不是糟糕的日历类。如上所述的一些想法,让临时调节器完成繁重的工作。但请记住,如果一天中的时间对新日期无效,例如在夏时制(DST)转换期间,则一天中的时间可能会被更改。

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;
ZonedDateTime zdtSameOrNextWednesday = zdt.with( ta ) ;

java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.DateCalendar

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

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

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获得java.time课程?

  • JavaSE8、JavaSE9及更高版本
  • 许多java.time功能被反向移植到Java6
  • 更高版本的Android捆绑包实现了java。时间课
  • 对于早期的Android系统(

额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

羊舌兴文
2023-03-14

虽然您的问题文本只说要查找下一个dayOfWeek,但您的代码还包括一天中的时间,形式为小时分钟

假设你希望将来第一次出现这种组合,即dayOfWeekhourminute,这意味着如果今天是dayOfWeek,如果一天的时间晚于现在,你要么想要今天;如果一天的时间早于现在,你想要下周。

你可以这样做:

int dayOfWeek = Calendar.WEDNESDAY;
int hour      = 10; // 10 AM
int minute    = 0;

Calendar cal = Calendar.getInstance(); // Today, now
if (cal.get(Calendar.DAY_OF_WEEK) != dayOfWeek) {
    cal.add(Calendar.DAY_OF_MONTH, (dayOfWeek + 7 - cal.get(Calendar.DAY_OF_WEEK)) % 7);
} else {
    int minOfDay = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
    if (minOfDay >= hour * 60 + minute)
        cal.add(Calendar.DAY_OF_MONTH, 7); // Bump to next week
}
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

System.out.println(cal.getTime()); // Prints: Wed May 10 10:00:00 EDT 2017
 类似资料:
  • 本文向大家介绍js获取指定日期周数以及星期几的小例子,包括了js获取指定日期周数以及星期几的小例子的使用技巧和注意事项,需要的朋友参考一下 JS获取日期时遇到如下需求,根据某年某周获取一周的日期。如开始日期规定为星期四到下一周的星期五为一周。 代码如下: 如获取2016年第一周日期,从周四开始算。则第一周的日期范围为2016-01-07 至 2016-01-15 在提供一段调用的参考代码:

  • 问题内容: 我有当前日期,还有一个常数,它指示星期几。我想基于该常数获取一周的开始日期。如果我将一周的第一天硬编码为星期一(或其他任何东西),那么这很简单。但是一周的第一天一直在变化。因此,我不想在每次更改第一天时都更改代码。 这是我尝试使用Java的Calendar的方法: 我想获取一周的开始日期。上面的函数返回星期的第一天,并且星期开始日期被硬编码为星期六。每当星期开始日期以上的要求发生变化时

  • 问题内容: 如何获得当前一周的星期一和星期五的日期? 我有以下代码,但是如果当前日期是星期日或星期六,则它将失败。 问题答案: 这些strtotime输入效果很好: 您需要做的就是将逻辑包装在一些if语句中。

  • 问题内容: 例如,我的日期为:“ 23/2/2019”(2019年2月23日)。我想将其传递给将返回星期几的函数。我怎样才能做到这一点? 在此示例中,该函数应返回 “ Tue”。 另外,如果只需要按日排序,那么如何检索呢? 问题答案: 是。根据你的具体情况: 你可以使用: 如果你需要的输出为Tue,而不是3(被索引从1开始的每周星期天天,见Calendar.SUNDAY),而不是通过日历打算,只是

  • 问题内容: 我需要输出从当前日期开始的未来12个月的日期列表(仅星期一和星期二),如下所示: 2010年1月 星期二2010年1月12日 星期一2010 年1月18日 星期二2010 年1月19日 星期一2010 年1月25 日星期一2010年 2月2日 星期二2010 年2月8日 星期一2010年2月9日星期二2010 年 2月 15 日星期一2010年2月15日 星期二2010 年2月16日

  • 问题内容: 因此,对于一个开始日期和结束日期,我想确定在这两个日期之间发生的一周中的特定天数。 那么多少个星期一,星期二等 我知道我可以在“开始日期”和“结束日期”之间循环并每天检查一次,但是可能相差很多天。我更喜欢不需要循环的东西。有任何想法吗?(必须在SQL Server2005+中受支持) 问题答案: 鉴于我 认为 您正在尝试获得的结果,应该这样做: