如何将工作日和时间对象解析为今天的下一个逻辑日期?

时间:2014-08-08 08:47:29

标签: java

我在字符串中有一个看起来像MON 07:15的日期。我正在尝试使用以下代码片段将其解析为Date

System.out.println(new SimpleDateFormat("E kk:mm").parse("MON 07:15"));

使用上面的代码,打印一个日期为:

Mon Jan 05 07:15:00 EET 1970

我想将日期字符串解析为下一个即将到来的日期。在发布时,我的本地日期和时间是Fri Aug 08 11:45:00 EEST 2014,下一个星期一将是11日,所以我正在寻找的结果日期是Mon Aug 11 07:15:00 EEST 2014。我怎么解析这个?


我将要解析的日期和时间对象将来都是。

3 个答案:

答案 0 :(得分:7)

我会将解析与其他所有内容分开。

按照你已经做的那样解析价值,这会给你一个错误年份的日期。

从那时起,花时间和星期几 - 这些都是重要的事情。你可以抛弃其他所有东西。

接下来,获取当前日期和时间,并执行您需要的任何操作,以便获得正确的日期/时间。你应该考虑:

  • 您对哪个时区感兴趣?
  • 如果当前时间是星期一的06:00,并且您在周一07:15被要求,这是指今天还是下周一?
  • 如果当前时间是星期一的08:00,并且您在周一07:15被要求,这是指今天还是下周一?

通过将解析与计算分开,可以使测试更简单二:分别测试每个操作。我建议使用某种时钟抽象来表示"一个可以及时获取当前瞬间的对象" - 通过这种方式,您可以测试"所需日期/时间的各种组合"和"当前日期/时间"。

理想情况下,使用Java 8中的java.timeJoda Time - 两者都 java.util.* API更好。

答案 1 :(得分:0)

您是否正在寻找以下内容?

 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());
    }

Out put:

   Mon Aug 11 07:15:00 IST 2014

给我发表评论告诉我,我的问题是否正确。

答案 2 :(得分:0)

这个答案解决了第二部分,即今天的下一个逻辑日期。

避免使用.Date / .Calendar

java.util.Date&与Java捆绑在一起的.Calendar类非常麻烦。避免它们。

Joda-Time或java.time

我建议学习如何使用复杂的日期时间库。在Java中,这意味着:

时区

时区对于确定日期和星期几至关重要。使用proper time zone names,绝不使用3或4个字母代码。

如果忽略时区,则将隐式应用JVM的当前默认时区。这意味着将应用程序从一台计算机移动到另一台计算机时,或者当系统管理员更改主机时区时,或同一JVM中任何应用程序的任何线程中的任何Java代码决定调用setDefault即使在您的应用执行期间。

示例代码以获取下一周的

以下是使用Joda-Time 2.7的示例代码。

获取您想要/期望的时区。如果使用UTC,请使用常量DateTimeZone.UTC

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );

获取所需的日期时间值。我在这里使用当前时刻。

DateTime dateTime = DateTime.now( zone );

指定您想要的未来星期几。请注意,Joda-Time在一周的第一天使用明智的#1,而不是在java.util.Calendar中找到从零开始的计数。根据国际规范和标准(不是美国常见的星期日),每周的第一天是星期一。

int dayOfWeek = DateTimeConstants.SATURDAY;

withDayOfWeek命令可能会及时返回。因此,我们使用ternary operator (?:)确保我们根据需要添加一周,以便及时前进。

DateTime future = ( dateTime.getDayOfWeek() < dayOfWeek )
        ? dateTime.withDayOfWeek( dayOfWeek )
        : dateTime.plusWeeks( 1 ).withDayOfWeek( dayOfWeek );

您可能希望将时间调整为当天的第一时刻,以强调对当天的关注,而不是当天的特定时刻。

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 );

运行时。

Next day # 6 after 2015-04-18T16:03:36.146-04:00 is 2015-04-25T00:00:00.000-04:00