我在字符串中有一个看起来像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
。我怎么解析这个?
我将要解析的日期和时间对象将来都是。
答案 0 :(得分:7)
我会将解析与其他所有内容分开。
按照你已经做的那样解析价值,这会给你一个错误年份的日期。
从那时起,花时间和星期几 - 这些都是重要的事情。你可以抛弃其他所有东西。
接下来,获取当前日期和时间,并执行您需要的任何操作,以便获得正确的日期/时间。你应该考虑:
通过将解析与计算分开,可以使测试更简单二:分别测试每个操作。我建议使用某种时钟抽象来表示"一个可以及时获取当前瞬间的对象" - 通过这种方式,您可以测试"所需日期/时间的各种组合"和"当前日期/时间"。
理想情况下,使用Java 8中的java.time
或Joda 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)
这个答案解决了第二部分,即今天的下一个逻辑日期。
java.util.Date&与Java捆绑在一起的.Calendar类非常麻烦。避免它们。
我建议学习如何使用复杂的日期时间库。在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