我有一个验证方法,将两个输入作为开始日期和结束日期,并检查结束日期是否有效,即在开始日期之后。我使用Calendar方法获取两个日期的毫秒数并得到差值。如果差值为负值,则其无效的结束日期,即结束日期早于开始日期。结束日期的毫秒值应始终大于开始日期。但在某些情况下,在开始日期的情况下,getTimeInMillis()会提供更大的值。
这是我的代码:
public class ValidationProcessor {
private void testTimeDiff(String startDate, String endDate) throws Exception {
Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
// Set the dates for calendars
cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]),
Integer.parseInt(startDate.split("-")[2]));
cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]),
Integer.parseInt(endDate.split("-")[2]));
long milis1 = cal1.getTimeInMillis();
long milis2 = cal2.getTimeInMillis();
System.out.println("milis1::: " + milis1);
System.out.println("milis2::: " + milis2);
long diff = milis2 - milis1;
System.out.println("diff::: " + diff);
if (diff <= 0) {
throw new Exception("Invalid End Date. End Date Must Be After Start Date");
}
}
public static void main(String args[]) {
ValidationProcessor test = new ValidationProcessor();
try {
test.testTimeDiff("2015-01-31", "2015-02-01");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
输出为:
milis1::: 1425367717308
milis2::: 1425194917308
diff::: -172800000
java.lang.Exception: Invalid End Date. End Date Must Be After Start Date
这里2015-01-31是开始日期,2015-02-01是结束日期。由于开始日期(2015-01-31)以毫秒为单位的值大于结束日期(2015-02-01)因此它会给出错误的结果。
那么这是Calendar
类的方法getTimeInMillis()
的问题还是我做错了什么?
一个问题是,如果我们将月份设置为-1,那么它会给出正确的结果。喜欢
cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]) -1,
Integer.parseInt(startDate.split("-")[2]));
cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]-1),
Integer.parseInt(endDate.split("-")[2]));
它给出,差异为86400000
使用cal1。getTime()。getAfter(cal2.getTime())
更新1
要填满您的日历,您应该像下面这样做
//cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]), Integer.parseInt(startDate.split("-")[2]));
//cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]), Integer.parseInt(endDate.split("-")[2]));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
cal1.setTime(df.parse(startDate));
cal2.setTime(df.parse(endDate));
那么您的原始代码也可以工作。
更新2
而您可以避免为此特定用途使用日历并直接使用日期对象。
Date date1 = df.parse(startDate);
Date date2 = df.parse(endDate);
long milis1 = date1.getTime();
long milis2 = date2.getTime();
这可能是因为Calendar.getInstance()
为您提供当前时间戳(填写了小时、分钟等所有字段),而您没有明确清除这些额外的字段(您只设置了年、月和日期)。
此外,请记住日期。set(int year、int month、int day)使用基于0的月份(例如,一月=0、二月=1等),因此您的转换当前是错误的。
更新:我认为这是两者的结合;您的测试日期2015-01-31被解析为2015年2月31日,这当然无效,导致出现意外的值。
问题内容: 执行以上代码段后,month的值为10而不是11。 问题答案: 月份从0而不是1索引,因此10是11月,而11是12月。
我想在将一周的第一天设置为周日后,将2018年10月9日这一周作为一年中的42周。我仍然从下面的代码片段中得到41的输出 我错过了什么吗? 背景:我们一周的开始可能是可变的。我们的配置能够让用户决定一周的第一天。
我想创建一个日历对象,并将其设置为某一年和该年中的一周。 当我将calendar对象传递给setWeekChecked方法时,这是它的toString: java.util.gregoriancalendar[time=?,arefieldsset=false,lenient=true,zone=America/New_York,firstDayofWeek=1,minimalDaysinfirs
问题内容: 所以我在这里呆了几个小时,它返回正确的Year和Day,但是由于某种奇怪的原因,它返回了错误的月份。我确定它是一个简单的修复程序,但我似乎无法弄清楚。 问题答案: 要获得本月的1-12数字: 最好指定所需/预期的时区。 类似地,呼叫和。 细节 它返回错误的月份 就像其他人所说的,在 1月至12月的 几个月中,他们疯狂地编号为0-11, 而不是1-12。在旧的日期时间类中,许多糟糕的设计
所以我已经研究了几个小时了,它返回了正确的年和日,但是由于一些奇怪的原因,它返回了错误的月份。我确信这是一个简单的修复,但我似乎无法解决这个问题。
当我用mockito模拟它并在以下情况下使用该方法时: 我得到了错误: 无法解析方法“then return(java.lang.String)” 但是上面返回的是可选的'<'object'>'和非可选的'<'string'>的实例。 为什么我不能直接返回一个可选的'<'string'>'实例呢?如果可以的话,我该怎么做呢?