Java 如何将weekday和time对象解析为从今天开始的下一个逻辑日期?
我在字符串中有一个日期,看起来像Java 如何将weekday和time对象解析为从今天开始的下一个逻辑日期?,java,Java,我在字符串中有一个日期,看起来像MON 07:15。我试图使用以下代码片段将其解析为日期: System.out.println(new SimpleDateFormat("E kk:mm").parse("MON 07:15")); 使用上述代码,打印一个日期,内容如下: Mon Jan 05 07:15:00 EET 1970 我希望将日期字符串解析为下一个即将到来的日期。在发布时,我的本地日期和时间是2014年8月8日星期五11:45:00,下周一是11日,因此我要查找的结果日期是20
MON 07:15
。我试图使用以下代码片段将其解析为日期
:
System.out.println(new SimpleDateFormat("E kk:mm").parse("MON 07:15"));
使用上述代码,打印一个日期,内容如下:
Mon Jan 05 07:15:00 EET 1970
我希望将日期字符串解析为下一个即将到来的日期。在发布时,我的本地日期和时间是2014年8月8日星期五11:45:00,下周一是11日,因此我要查找的结果日期是2014年8月11日星期一07:15:00。我如何解析这个
我将要解析的day和time对象将始终位于将来。我会将解析与其他所有对象分开 按照您已经在做的方式解析该值,这会给您一个错误年份的日期 从这一点开始,把一天中的时间和一周中的某一天都考虑进去——这些都是重要的事情。你可以把其他的都扔掉 接下来,获取当前日期和时间,并执行您需要的任何操作,以获得正确的日期/时间。你应该考虑:
- 你对哪个时区感兴趣
- 如果当前时间是周一的06:00,而你被要求在周一的07:15,那是指今天还是下周一
- 如果当前时间是周一的08:00,而你被要求在周一的07:15,那是指今天还是下周一
理想情况下,使用Java8中的
java.time
,或者-两者都比java.util.*
API好得多。您看起来像下面这样吗
DateFormat df = new SimpleDateFormat("E kk:mm");
Date date = df.parse("MON 07:15");
Date today = new Date();
Calendar calendar = Calendar.getInstance();
Calendar calendar1 = Calendar.getInstance();
calendar.setTime(today);
calendar1.setTime(date);
if (calendar.get(Calendar.DAY_OF_WEEK) == calendar1.get(Calendar.DAY_OF_WEEK)) {
String time = df.format(today);
Date t1 = df.parse(time);
if (t1.before(date)) {
calendar.set(Calendar.HOUR, calendar1.get(Calendar.HOUR));
calendar.set(Calendar.MINUTE, calendar1.get(Calendar.MINUTE));
calendar.set(Calendar.SECOND, 0);
System.out.println(calendar.getTime());
} else {
calendar.add(Calendar.DATE, 7);
calendar.set(Calendar.HOUR_OF_DAY, calendar1.get(Calendar.HOUR));
calendar.set(Calendar.MINUTE, calendar1.get(Calendar.MINUTE));
calendar.set(Calendar.SECOND, 0);
System.out.println(calendar.getTime());
}
} else {
int toDay = calendar.get(Calendar.DAY_OF_WEEK);
int givenDay = calendar1.get(Calendar.DAY_OF_WEEK);
int count = 7 - toDay + givenDay;
calendar.add(Calendar.DAY_OF_MONTH, count);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.HOUR_OF_DAY, calendar1.get(Calendar.HOUR));
calendar.set(Calendar.MINUTE, calendar1.get(Calendar.MINUTE));
System.out.println(calendar.getTime());
}
输出:
Mon Aug 11 07:15:00 IST 2014
请给我留言,告诉我你的问题是否正确 这个答案涉及到第二部分,即从今天开始的下一个逻辑日期 避免.Date/.Calendar 与java捆绑在一起的java.util.Date和.Calendar类是出了名的麻烦。避开它们 Joda Time或java.Time 我建议学习如何使用复杂的日期时间库。在Java中,这意味着:
- (内置于Java8中,灵感来自Joda Time)
DateTimeZone.UTC
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
获取所需的日期时间值。在这里,我使用当前时刻
DateTime dateTime = DateTime.now( zone );
指定所需的未来工作日。请注意,Joda Time对一周的第一天使用合理的#1,而不是java.util.Calendar中基于零的计数。根据国际规范和标准,一周的第一天是星期一(而不是美国常见的星期天)
withDayOfWeek
命令可能会返回时间。因此,我们使用一种方法来确保我们能够及时前进,根据需要增加一周的时间
DateTime future = ( dateTime.getDayOfWeek() < dayOfWeek )
? dateTime.withDayOfWeek( dayOfWeek )
: dateTime.plusWeeks( 1 ).withDayOfWeek( dayOfWeek );
转储到控制台
System.out.println( "Next day # " + dayOfWeek + " after " + dateTime + " is " + future );
跑步的时候
第二天#6在2015-04-18T16:03:36.146-04:00之后是2015-04-25T00:00:00.000-04:00
我对我的问题进行了编辑,因为我忘了提到我将要分析的day和time对象将始终在未来。@MridangAgarwalla:您正在分析的值根本没有指定日期-它不是在未来或过去。。。但即便如此,这也不一定能回答我答案中的问题。不管怎样,这取决于你去解决——把解析和计算分开,如果你对其中任何一个有问题,你可以问一个更具体的问题,这只是其中一个问题。
future = future.withTimeAtStartOfDay(); // Adjust time-of-day to first moment of the day to stress the focus on the entire day rather than a specific moment within the day. Or use `LocalDate` class.
System.out.println( "Next day # " + dayOfWeek + " after " + dateTime + " is " + future );