java.util.date格式转换

时间:2014-02-27 05:22:54

标签: java date

这里的问题是我有以下代码:

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-23 sded的输入   newDate1是2013-08-28(dB格式),newDate2是2013-09-01(in   dB格式)仍接受输入exd并取出另一个输入   列。

**我已经剪断了相关代码,对于任何问题,请发表评论。任何帮助表示赞赏。在此先感谢!

4 个答案:

答案 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?");
}

编辑:关于用户问题的示例

exdnot 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 answerthis answer

Parse First,Process Second

首先将所有日期字符串和日期时间字符串解析为日期时间对象。一旦掌握了一些合理的对象,就可以继续进行比较和业务逻辑。

约达时间

java.util.Date和.Calendar类非常麻烦。避免它们。

而是在Java 8中使用开源库Joda-Time或新的java.time package

Joda-Time提供三个类来处理一段时间:句点,持续时间和Interval。它们包括非常方便的比较方法,包括containsabutsoverlapgap

搜索StackOverflow

搜索“joda interval”以查找其他示例。

答案 3 :(得分:0)

如果您只是比较两个日期,其中一个日期具有精确度,您应该截断时间,以便只表示日期。

使用Apache commons:

DateUtils.truncate(dateYouWantToTruncate, Calendar.Date);

因为您的格式化程序使用ISO-8601(第一年,然后是月份,然后是一天),您可以使用您创建的格式化程序将两个日期转换为字符串并比较字符串。

formatter.format(sd).compareTo(formatter.format(newDate1));

您也可以使用Calendar类。它相当冗长,但可行。