Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将weekday和time对象解析为从今天开始的下一个逻辑日期?_Java - Fatal编程技术网

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)
时区 时区对于确定一周中的哪一天至关重要。切勿使用3或4个字母的代码

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

获取每周第二天的示例代码 下面是使用JodaTime2.7的示例代码

获得你想要/期望的时区。如果在中工作,请使用常量
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 );