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



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

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

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

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

目前我尝试了这样的事情:

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

小时和分钟很好,但是我如何存储第二天/月/年?

tl;博士

ZonedDateTime.of(
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.next( DayOfWeek.THURSDAY ) ) ,
LocalTime.of( hours , minutes ) ,
ZoneId.of( "America/Montreal" )
).toString()

如果该区域中该日期无效,则ZonedDateTime类将调整一天中的时间。

java.time

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

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

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

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

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

确定 UI 小组件表示的DayOfWeek枚举对象。如果按编号跟踪,则根据ISO 8601标准,周一至周日的班级编号为1-7。

DayOfWeek dow = DayOfWeek.of( 1 ) ;  // Monday=1.

使用在TemporalAdjusters中找到的TemporalAdjuster来确定与一周中同一天相同的下一个日期。

LocalDate ld = today.with( TemporalAdjusters.next( dow ) ) ;

从小时和分钟数实例化LocalTime

LocalTime lt = LocalTime.of( hours , minutes );

组合以确定时间轴中的实际时刻。

ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

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

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

String output = zdt.toString() ;

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

ZonedDateTime zdt = ZonedDateTime.parse( input ) ;

关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧传统日期时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。

从哪里获得java.time类?

Java SE
  • 8Java SE 9及更高版本
    • 内置。
    • 具有捆绑实现的标准 Java API 的一部分。
    • Java 9添加了一些小功能和修复。
  • Java SE 6 和 Java SE 7 大部分
    • java.time 功能在ThreeTen-Backport中向后移植到 Java 6 和 7。
    • Android ThreeTenABP项目专门为Android改编了ThreeTen-Backport(如上所述)。
    • 请参阅如何使用ThreeTenABP...

最新更新