LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-30

背景

毎秒更新されるファイルが毎日0時に新しい日付で作成されます。
更新中のファイル以外で最新のファイルを特定したいなーと思ったので
その際のコードを書き残します。
こんなイメージ.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

ファイル名を書き出す処理と組み合わせてみる

以前書いた ディレクトリの中身を確認する を使って複数あるファイルの名前と更新日を書き出します。

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

時間を計算する

時間を計算するには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条件に更新時間は1日以内でかつ、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);
          }
        }
    }
}

では、実行してみます。更新中のファイルを除いて更新1日以内のファイルが取得できました。
3.png

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2