有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。我如何解析这个


我将要解析的day和time对象将始终位于将来


共 (3) 个答案

  1. # 1 楼答案

    你看起来像是在跟踪吗

     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
    

    请给我留言,告诉我你的问题是否正确

  2. # 2 楼答案

    这个答案涉及第二部分,即从今天开始的下一个逻辑日期

    避免。日期/。日历

    爪哇。util。日期&。与Java捆绑在一起的日历类是出了名的麻烦。避开它们

    Joda Time或java。时间

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

    时区

    时区对于确定一周中的哪一天至关重要。使用proper time zone names,不要使用3或4个字母的代码

    如果忽略时区,JVM的当前默认时区将被隐式应用。这意味着在将应用程序从一台机器移动到另一台机器时,或者当系统管理员更改主机的时区时,或者当同一JVM中任何应用程序的任何线程中的任何Java代码决定调用^{}时,甚至在应用程序执行期间,也会有不同的输出

    获取每周第二天的示例代码

    下面是使用Joda Time 2.7的示例代码

    获得你想要/期望的时区。如果在UTC中工作,请使用常量DateTimeZone.UTC

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

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

    DateTime dateTime = DateTime.now( zone );
    

    指定您想要的未来一周的哪一天。请注意,Joda Time在一周的第一天使用合理的#1,而不是java中基于零的计数。util。日历根据国际规范和标准,一周的第一天是周一(而不是美国常见的周日)

    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
    
  3. # 3 楼答案

    我会把解析和其他的东西分开

    按照你已经在做的方式分析这个值,这会给你一个错误年份的日期

    从这一点开始,把一天中的时间和一周中的某一天都考虑进去——这些都是重要的事情。你可以把其他的都扔掉

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

    • 你对哪个时区感兴趣
    • 如果当前时间是周一06:00,而你被要求周一07:15,那是指今天还是下周一
    • 如果当前时间是周一的08:00,而你被要求在周一的07:15,那是指今天还是下周一

    通过将解析从计算中分离出来,您可以使测试变得更简单。两种方法是:分别测试每个操作。我建议使用某种时钟抽象来表示“一个可以让你获得当前时间的对象”——这样你就可以测试“期望的日期/时间”和“当前日期/时间”的各种组合

    理想情况下,使用Java8中的java.timeJoda Time——两者都比java.util.*API好得多