メモ : 【Java】更新日が1日以内のファイルを特定する

#**背景**
毎秒更新されるファイルが毎日0時に新しい日付で作成されます。
更新中のファイル以外で最新のファイルを特定したいなーと思ったので
その際のコードを書き残します。
![こんなイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/237418/0a1cbd60-fa31-f2e8-db29-cfe7b489ee82.png)
#**更新日時を取得する**
File.lastModified()で更新日を取得します。
でも、返ってくる値はLong型で数字の羅列なので、識別できるようにSimpleDateFormatを使って
**`"yyyy/MM/dd HH:mm:ss"`** という形式で表示しています。

```test.java
import java.io.File;
import java.text.SimpleDateFormat;

public class test{

  public static void main(String[] args){

    String filepath = "C:/tedkuma/BOX/20180729.csv";             //参照するディレクトリ
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//日付時刻の書式定義
    File targetFile = new File(filepath);
    Long lastModified = targetFile.lastModified();   //更新日時取得するのにlastModified()を使う。
    String update_time = simpleDateFormat.format(lastModified);  //longで来た値をsimpleDateFormatで整形
    System.out.println(update_time);
  }
}
```
では、実行してみます。更新日時が取得できました。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/237418/91226be4-37be-bf42-7810-22150f2c8446.png)


#**ファイル名を書き出す処理と組み合わせてみる**
以前書いた [ディレクトリの中身を確認する](https://qiita.com/tedkuma/items/4d0f66443b1cefdd2392) を使って複数あるファイルの名前と更新日を書き出します。

```test.java
import java.io.File;
import java.text.SimpleDateFormat;

public class test
{
    public static void main(String[] args)
    {
        String filepath = "C:/tedkuma/BOX/";

        File dir = new File(filepath);
        File[] list = dir.listFiles();          //listFilesを使用してファイル一覧を取得
        for(int i=0; i<list.length; i++) {
          String filename = list[i].getName();
          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//日付時刻の書式定義
          File targetFile = new File(filepath+filename);
          Long lastModified = targetFile.lastModified();
          String update_time = simpleDateFormat.format(lastModified);
          System.out.println(update_time+"："+filename);
        }
    }
}
```
では、実行してみます。ファイル名と更新日が表示できました。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/237418/546a8aab-2b9f-0ff6-282c-e33c4ace0182.png)


#**時間を計算する**
時間を計算するにはCalendarクラスを使います。(import java.util.Calendar;を追加)
**Calendar.getInstance()で現在の時間を取得**できます。
変数.add(Calendar.DATE, 1);で 1日後の時間、 DATEをMINUTEに変えれば1分後、
第2引数の 1 を -1 に変えることで1日前や1分前という時間を取得することもできます。

更新日を取得したlastModified(long型)から直接Calendar型に変換できないので
どちらにも変換できるDate型を使用しています。(import java.util.Date;を追加)

**compareTo()を使用して大小を比較**することが出来ます。
**A**.compareTo(**B**)　という書き方をしたときに
　**A** > **B**　Aが前の時は　-1
　**A** < **B**　Aが後の時は　 1
　**A** = **B**　　同じ時は　　0　が返ります。

#**更新済みファイルから更新日が1日以内のファイルを特定する**
毎秒更新されている更新中のファイルは取得したくないので
if条件に更新時間は１日以内でかつ、10分以上経過しているものというのを入れました。

```test.java
import java.io.File;
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class test{

    public static void main(String[] args){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String filepath = "C:/tedkuma/BOX/";

        File dir = new File(filepath);
        File[] list = dir.listFiles();

        Calendar st = Calendar.getInstance();//Calendarクラスで現在日時を取得
        st.add(Calendar.DATE, -1);           //1日前を取得
        Date start = st.getTime();           //Dateに直す

        Calendar en = Calendar.getInstance();//Calendarクラスで現在日時を取得
        en.add(Calendar.MINUTE, -10);        //10分前を取得
        Date end = en.getTime();

        for(int i=0; i<list.length; i++) {  //対象のパス内のファイル分処理を実行
          String filename = list[i].getName();
          File targetFile = new File(filepath+filename);
          Long lastModified = targetFile.lastModified();
          Date koushin = new Date(lastModified);

          if(start.compareTo(koushin)<0 && end.compareTo(koushin)>0){//compareToで比較
            String update_time = simpleDateFormat.format(koushin);
            System.out.println(update_time+"："+filename);
          }
        }
    }
}
```
では、実行してみます。更新中のファイルを除いて更新１日以内のファイルが取得できました。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/237418/71e4c441-b891-0f06-52e5-9db79a8176bc.png)