2017-05-08 119 views
0

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

小时和分钟都很好,但我怎么能存储下一个日/月/年?

+0

使用''上对象Calendar' –

+0

add'方法,你可以添加7天的日历中选定的日期,你会得到的星期几下周 –

+0

我用添加日历上的选择,但我想要一周的第二天,它可以少于7天,例如今天是星期一,明天是星期二,如果我选择星期二我想得到明天的日期,在我选择星期二的第二天我得到第11天: S –

回答

0

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/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

确定DayOfWeek由您的UI小部件表示的枚举对象。如果按照编号进行跟踪,那么根据ISO 8601标准,该课程的编号为1-7星期一至星期日。

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

使用TemporalAdjuster发现TemporalAdjusters确定一个日期与当天的星期 - 。

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.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

+0

谢谢你的朋友,你知道一种方法来做到这一点与日历? –

+0

@AntonioCosta **避免使用java.util.Calendar **。这个类的设计很糟糕,有缺陷并且令人困惑 - 一团糟。java.time类被开发来替代'Calendar','Date'等。查看我添加到我的答案中的最后一部分,了解如何在Android中使用java.time的后端端口。很值得添加到您的项目的麻烦。 –

相关问题