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对象将始终位于将来
# 1 楼答案
你看起来像是在跟踪吗
输出:
请给我留言,告诉我你的问题是否正确
# 2 楼答案
这个答案涉及第二部分,即从今天开始的下一个逻辑日期
避免。日期/。日历
爪哇。util。日期&。与Java捆绑在一起的日历类是出了名的麻烦。避开它们
Joda Time或java。时间
我建议学习如何使用复杂的日期时间库。在Java中,这意味着:
时区
时区对于确定一周中的哪一天至关重要。使用proper time zone names,不要使用3或4个字母的代码
如果忽略时区,JVM的当前默认时区将被隐式应用。这意味着在将应用程序从一台机器移动到另一台机器时,或者当系统管理员更改主机的时区时,或者当同一JVM中任何应用程序的任何线程中的任何Java代码决定调用^{} 时,甚至在应用程序执行期间,也会有不同的输出
获取每周第二天的示例代码
下面是使用Joda Time 2.7的示例代码
获得你想要/期望的时区。如果在UTC中工作,请使用常量
DateTimeZone.UTC
获取所需的日期时间值。在这里,我使用当前时刻
指定您想要的未来一周的哪一天。请注意,Joda Time在一周的第一天使用合理的#1,而不是java中基于零的计数。util。日历根据国际规范和标准,一周的第一天是周一(而不是美国常见的周日)
withDayOfWeek
命令可能会回到过去。因此,我们使用ternary operator (^{你可能想把一天中的时间调整到一天中的第一个时刻,以强调对一天的关注,而不是一天中的某个特定时刻
转储到控制台
跑步的时候
# 3 楼答案
我会把解析和其他的东西分开
按照你已经在做的方式分析这个值,这会给你一个错误年份的日期
从这一点开始,把一天中的时间和一周中的某一天都考虑进去——这些都是重要的事情。你可以把其他的都扔掉
接下来,获取当前的日期和时间,并执行任何需要的操作,以获得正确的日期/时间。你应该考虑:
通过将解析从计算中分离出来,您可以使测试变得更简单。两种方法是:分别测试每个操作。我建议使用某种时钟抽象来表示“一个可以让你获得当前时间的对象”——这样你就可以测试“期望的日期/时间”和“当前日期/时间”的各种组合
理想情况下,使用Java8中的
java.time
或Joda Time——两者都比java.util.*
API好得多