【问题标题】:Set Date to next day of week将日期设置为一周的下一天
【发布时间】:2017-10-06 12:25:42
【问题描述】:

我正在使用 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();

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

【问题讨论】:

  • Calendar对象上使用add方法
  • 您可以在日历中添加所选日期的7天,您将获得下周选择的星期几
  • 我在日历上使用了添加,但我想要一周的第二天,它可以少于 7 天,例如今天是星期一,明天是星期二,如果我选择星期二我想得到明天的日期,在我选择星期二的那一刻,我得到了第 11 天:S

标签: java android date


【解决方案1】:

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 类表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

continent/region 的格式指定proper time zone name,例如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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

【讨论】:

  • 谢谢你的朋友,你知道用日历的方法吗?
  • @AntonioCosta 避免使用java.util.Calendar。该类设计糟糕、有缺陷且令人困惑——一团糟。java.time 类的开发是为了替换CalendarDate 等。有关在 Android 中使用 java.time 的后向端口,请参阅我添加到答案中的部分的最后一部分。值得费心添加到您的项目中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2017-08-25
  • 2019-08-30
相关资源
最近更新 更多