这里的问题是我有以下代码:
String newPattern = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat formatterDB = new SimpleDateFormat(newPattern);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String nDate1 = rs.getString("FromDate");
String nDate2 = rs.getString("ToDate");
Date newDate1 = formatterDB.parse(nDate1);
Date newDate2 = formatterDB.parse(nDate2);
Date sd = formatter.parse("2013-08-22");
Date ed = formatter.parse("2013-08-24");
Date exd = formatter.parse("2013-08-23");
要验证的第一个条件是exd
位于[sd,ed
]之间,如果为真,那么exd
也应位于[newDate1,newDate2
]之间,如果这是真的然后将获取dB中的其他元素。
请注意,两个日期的来源不同,一个日期来自完全不同格式的dB,另一个日期作为字符串输入给出,需要进行比较,因此它们的格式不同。
为了更清楚,这是一个例子:
我为
exd
提供了输入,作为2013-08-23sd
和ed
的输入newDate1
是2013-08-28(dB格式),newDate2
是2013-09-01(in dB格式)仍接受输入exd
并取出另一个输入 列。
**我已经剪断了相关代码,对于任何问题,请发表评论。任何帮助表示赞赏。在此先感谢!
答案 0 :(得分:2)
您必须使用java内置日期功能。
这是一个小例子:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2009-12-31");
Date date2 = sdf.parse("2010-01-31");
if(date1.compareTo(date2)>0){
System.out.println("Date1 is after Date2");
}else if(date1.compareTo(date2)<0){
System.out.println("Date1 is before Date2");
}else if(date1.compareTo(date2)==0){
System.out.println("Date1 is equal to Date2");
}else{
System.out.println("How to get here?");
}
编辑:关于用户问题的示例
exd
是not between
newDate1和newDate2 !!
public class DateCompare {
public static void main(String args[]) throws ParseException
{
String newPattern = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat formatterDB = new SimpleDateFormat(newPattern);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String nDate1 = "2013-08-29 11:11:11.000";
String nDate2 = "2013-09-01 11:11:11.000";
Date newDate1 = formatterDB.parse(nDate1);
Date newDate2 = formatterDB.parse(nDate2);
Date sd = formatter.parse("2013-08-22");
Date ed = formatter.parse("2013-08-24");
Date exd = formatter.parse("2013-08-23");
//Comparing exd to sd and ed
if(sd.compareTo(exd) * exd.compareTo(ed) > 0)
{
//comparing exd to newDate1 and newDate2
if(newDate1.compareTo(exd) * exd.compareTo(newDate2) > 0)
{
System.out.println("Success : Now you can fetch data from DB !");
}
else
{
System.out.println("Oops ! Can't fetch data !");
}
}
}
}
请注意在这种情况下,如果比较不同格式的日期if the dates are same, they won't return 0
,因为time factor
!时间也将进行比较,yyyy-MM-dd
格式的日期HH:mm:ss.SSS
全部为00:00:00.000
答案 1 :(得分:1)
这是处理问题的一种方法....
int flag=0;
if(exd.compareTo(sd)>0 )
if(exd.compareTo(ed)<0){
System.out.println(exd+" Lies between"+ sd +"and"+ ed);
flag=1;
}
/*convert from newPattern to "yyyy-MM-dd"*/
SimpleDateFormat formatterDB = new SimpleDateFormat(newPattern);
Date temp = formatterDB.parse(nDate1);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String temp1 = formatter.format(temp);
Date newDate1 = formatter.parse(temp1);
if(flag==1)
if(exd.compareTo(newDate1)>0)
if(exd.compareTo(newDate2)<0){
/* your code to fetch other item from DB*/
}
答案 2 :(得分:1)
我的这两个答案都有你需要的概念和示例代码来整齐地解决你的问题:
您有一些仅限日期的值和一些日期时间值。您需要决定日期值与日期时间的关系意味着什么。
一种可能性是,仅限日期被视为一天中的第一个时刻,例如2014-01-02 00:00:00
。请注意,第一时刻的时间通常为 00:00:00
,但不一定是因为夏令时(DST)或其他异常可能会移动时间。例如,01:00:00
。当将仅限日期的字符串解析为日期时间时,Joda-Time将自动调整到第一时刻的时间。但请注意,您也可以调用withTimeAtStartOfDay
(忽略“午夜”相关的类/方法,因为它们几乎被创作者弃用)。
另一种可能性是,仅限日期应表示为从一天的第一时刻到第二天的第一时刻的时间跨度。
请注意,我指的是“半开放式”方法,其中开头是包含性的,结尾是独占的。半开放通常最适合时间跨度。
有关半开时间跨度的更多讨论和示例,请参阅我的this answer和this answer。
首先将所有日期字符串和日期时间字符串解析为日期时间对象。一旦掌握了一些合理的对象,就可以继续进行比较和业务逻辑。
java.util.Date和.Calendar类非常麻烦。避免它们。
而是在Java 8中使用开源库Joda-Time或新的java.time package。
Joda-Time提供三个类来处理一段时间:句点,持续时间和Interval。它们包括非常方便的比较方法,包括contains
,abuts
,overlap
和gap
。
搜索“joda interval”以查找其他示例。
答案 3 :(得分:0)
如果您只是比较两个日期,其中一个日期具有精确度,您应该截断时间,以便只表示日期。
使用Apache commons:
DateUtils.truncate(dateYouWantToTruncate, Calendar.Date);
因为您的格式化程序使用ISO-8601(第一年,然后是月份,然后是一天),您可以使用您创建的格式化程序将两个日期转换为字符串并比较字符串。
formatter.format(sd).compareTo(formatter.format(newDate1));
您也可以使用Calendar类。它相当冗长,但可行。