将日期设置为一周的第二天

Ant*_*sta 3 java android date

我正在使用 firebase 并使用 Android 构建应用程序。

我有一个DatePicker,我可以在其中选择星期几、小时和分钟。

当我选择日期并按提交时,我想存储的不是当前日期,甚至不是所选日期,而是与所选星期几相关的下一个日期。

想象一下,我选择星期四,明天是星期四,我想保存当前用户选择的日期和时间。

此刻我尝试了这样的事情:

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.DATE, dayOfWeek);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
dateMatch = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)

小时和分钟都可以,但是如何存储第二天/月/年呢?

Bas*_*que 6

太长了;博士

\n\n
ZonedDateTime.of(\n    LocalDate.now( ZoneId.of( "America/Montreal" ) )\n             .with( TemporalAdjusters.next( DayOfWeek.THURSDAY ) ) ,\n    LocalTime.of( hours , minutes ) ,\n    ZoneId.of( "America/Montreal" )\n).toString()\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果该日期在该区域无效,则班级ZonedDateTime会调整当天的时间。

\n\n

java.time

\n\n

现代方法使用 java.time 类。避免问题中出现的麻烦的旧遗留日期时间类。

\n\n

该类LocalDate表示仅日期值,没有时间和时区。

\n\n

时区对于确定日期至关重要。对于任何特定时刻,全球各地的日期都会因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而Montr\xc3\xa9al Qu\xc3\xa9bec中仍然是 \xe2\x80\x9cyesterday\xe2\x80\x9d 。

\n\n

以、、 或 等格式指定正确的时区名称。切勿使用 3-4 个字母的缩写,例如或,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

\n\n
ZoneId z = ZoneId.of( "America/Montreal" );\nLocalDate today = LocalDate.now( z );\n
Run Code Online (Sandbox Code Playgroud)\n\n

确定DayOfWeekUI 小部件代表的枚举对象。如果按编号跟踪,则根据 ISO 8601 标准,周一至周日的类别编号为 1-7。

\n\n
DayOfWeek dow = DayOfWeek.of( 1 ) ;  // Monday=1.\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用TemporalAdjusterfind inTemporalAdjusters确定下一个日期是一周中的同一天。

\n\n
LocalDate ld = today.with( TemporalAdjusters.next( dow ) ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

LocalTime从您的小时和分钟数字中实例化 a 。

\n\n
LocalTime lt = LocalTime.of( hours , minutes );\n
Run Code Online (Sandbox Code Playgroud)\n\n

结合起来确定时间轴中的实际时刻。

\n\n
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于夏令时 (DST) 等异常情况,您的特定时间可能对该区域的该日期无效。班级ZonedDateTime根据需要进行调整。请务必阅读类文档以了解其进行调整的策略。

\n\n

您可以使用标准ISO 8601格式将该对象序列化为文本,该格式由此类扩展以在方括号中附加时区名称。

\n\n
String output = zdt.toString() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过解析此类字符串来重构对象。

\n\n
ZonedDateTime zdt = ZonedDateTime.parse( input ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

关于 java.time

\n\n

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

\n\n

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

\n\n

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

\n\n

从哪里获取 java.time 类?

\n\n\n