java 当前时间下一周_关于Java:通过指定星期几来获取下一个日期

我需要使用日历来执行此方法,基本上我得到了星期几(1、2、3),每个int代表星期几(星期一,星期二)不是按此顺序,但是逻辑是这样。

我需要获取星期几的日期,假设今天是星期一,而用户选择Wednsesday,我需要获取下星期三的日期。

我目前的逻辑是:

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);

calendar.set(Calendar.HOUR_OF_DAY, hour);

calendar.set(Calendar.MINUTE, minute);

dateMatch = calendar.getTime();

星期几是从slidePicker传递过来的,代表星期几,如果我把Wednseday放给我6,这DAY_OF_WEEK不起作用

选择日期后,在日历对象中添加7天,然后获取星期几日历

仅供参考,麻烦的旧日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)现在已被遗留,由内置在Java 8和Java 9中的java.time类取代。请参见Oracle教程。

tl; dr

要获取今天之后的下一个星期三,或者如果已经是星期三,则坚持今天的日期。

LocalDate.now( ZoneId.of("Africa/Tunis" ) )

.with( TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY )  )

java.time

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

使用dayOfWeek枚举对象表示星期一至星期日。使用智能对象而不是哑整数来表示您的星期几意图。使您的代码更具自记录性,确保有效值,并提供类型安全性。

LocalDate类表示没有日期和时区的仅日期值。

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是"昨天"。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将您的期望/期望时区明确指定为参数。

以continent/region格式指定正确的时区名称,例如America/Montreal,Africa/Casablanca或Pacific/Auckland。切勿使用3-4个字母的缩写,例如EST或IST,因为它们不是真实的时区,不是标准化的,甚至不是唯一的(!)。

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

LocalDate today = LocalDate.now( z ) ;

使用TemporalAdjuster实现(例如TemporalAdjusters.nextOrSame)移动到另一个日期。

TemporalAdjuster ta = TemporalAdjusters.nextOrSame( DayOfWeek.WEDNESDAY ) ;

LocalDate nextOrSameWednesday = today.with( ta ) ;

如果要处理片刻,请使用ZonedDateTime类,而不要使用可怕的Calendar类。如上所述,让TemporalAdjuster做繁重的工作。但是请记住,如果该日对新日期无效,例如在夏令时(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

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧版旧式日期时间类,例如java.util.Date,Calendar和SimpleDateFormat。

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

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。

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

在哪里获取java.time类?

Java SE 8,Java SE 9和更高版本

内置的

标准Java API的一部分,具有捆绑的实现。

Java 9添加了一些次要功能和修复。

Java SE 6和Java SE 7

java.time的许多功能在ThreeTen-Backport中都被反向移植到Java 6和7。

安卓系统

更高版本的Android捆绑了java.time类的实现。

对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP…。

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter等。

尽管您的问题文本仅说要找到下一个dayOfWeek,但是您的代码也包含一天中的某个时间,形式为hour和minute。

假设您希望该组合的第一个将来出现,即dayOfWeek,hour和minute,这意味着如果今天是那个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

太棒了,但是有什么让我感到困惑,您没有设定不需要这样做的日子?

因为一天不能是今天+ 7天,所以用户选择了一天,今天是星期一,但是他可以选择星期三

@AntonioCosta是,星期三(4)-星期一(2)= 2,今天(星期一)+ 2天= 5月10日星期三。如果今天是星期四(5),则星期三(4)-星期四 (5)+ 7 = 6,并且5月11日,星期四+ 6天= 5月17日,星期三。代码没有设置星期几,而是计算要添加到当前日期的多少天才能到达该日期- 每周。

该死的,这真是太聪明了,真是个棒极了的答案,您是自己实施还是改编了,因为我从来没有找到这种解决方案,非常!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值