我正在使用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/Montreal
、Africa/Casablanca
或Pacific/Auckland
。切勿使用 3-4 个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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.Date
、Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
从哪里获得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 ThreeTenABP项目专门为Android改编了ThreeTen-Backport(如上所述)。
- 请参阅如何使用ThreeTenABP...。