簡體   English   中英

java.util.date格式轉換

[英]java.util.date Format Conversion

這里的問題是我有以下代碼:

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 ]之間,如果為true,則exd也應位於[ newDate1,newDate2 ]之間;如果為true,則將從dB中提取其他元素。

請不要兩個日期的來源都不同,一個日期完全來自於dB,而另一個日期則完全以不同的格式給出,而另一個日期則作為String輸入給出,因此需要將它們進行比較,因此它們的格式也不同。

為了更加清楚,這是一個示例:

我給exd的輸入作為2013-08-23,給sded的輸入是給定的newDate1是2013-08-28(以dB格式)和newDate2是2013-09-01(以dB格式)仍然接受輸入exd並獲取另一列。

**我已摘錄了相關代碼,如有任何問題,請發表評論。 任何幫助表示贊賞。 提前致謝!

您必須使用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 not between

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 0if the dates are same, they won't return 0 ,由於time factor if the dates are same, they won't return 0 還將比較時間,並且yyyy-MM-dd格式的日期的HH:mm:ss.SSS全部為00:00:00.000

這是解決問題的一種方法....

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*/
         }

簡短答案

我的以下兩個答案都包含了巧妙地解決問題所需的概念和示例代碼:

日期與日期時間

您有一些僅日期值和一些日期時間值。 您需要確定僅日期值相對於日期時間的含義。

一種可能是僅日期被認為是一天的第一時刻,例如2014-01-02 00:00:00 請注意,第一時刻的時間通常為 00:00:00 ,但不一定是因為夏令時(DST)或其他異常會改變時間。 例如01:00:00 當將僅日期的字符串解析為日期時間時,Joda-Time會自動將時間調整為第一天。 但是請注意,您也可以調用withTimeAtStartOfDay (忽略與“午夜”相關的類/方法,因為創建者實際上已棄用了它們)。

另一種可能性是,僅日期應表示為從一天的第一時刻到第二天的第一時刻的時間范圍。

半開

請注意,我指的是“半開放式”方法,其中開始是包容性的,而結尾是排他性的。 半開放通常最適合一段時間。

有關半開放時間跨度的更多討論和示例,請參閱此答案和我的答案

首先解析,然后處理

首先獲取所有已解析為日期時間對象的日期字符串和日期時間字符串。 一旦有了一些合理的對象,然后繼續進行比較和業務邏輯。

喬達時間

眾所周知,java.util.Date和.Calendar類很麻煩。 避免他們。

而是使用Java 8中的開源庫Joda-Time或新的java.time包

Joda-Time提供了三個類來處理時間跨度:Period,Duration和Interval 它們包括非常方便的比較方法,包括containsabutsoverlapgap

搜索StackOverflow

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

如果您只是比較兩個日期(其中一個具有精確的時間),則應截斷時間,以便兩個都代表Date。

使用Apache Commons:

DateUtils.truncate(dateYouWantToTruncate, Calendar.Date);

因為您的格式化程序使用的是ISO-8601(年份,然后是月份,然后是日期),所以您可以使用創建的格式化程序將兩個日期都轉換為字符串並比較字符串。

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

您也可以使用Calendar類。 這很冗長,但可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM