Javaで日付と時刻を扱う


java.time.LocalDateTime(java8)

  • LocalDateTime now = LocalDateTime.now();
  • LocalDateTime ymd = LocalDateTime.of(2016, 1, 1, 0, 0);
  • LocalDateTime ymdhms = LocalDateTime.of(2016, 1, 1, 23, 59, 59);
  • int year = ymd.getYear();
  • int month = ymd.getMonth().getValue();
  • int date = ymd.getDayOfMonth();
  • DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HHss");
  • dtf.format(ymdms);
  • Java8の日時APIはとりあえずこれだけ覚えとけ」が参考になる

(java7なら)Joda-Time

java.util.Date(できれば使わない)

  • 日時データを保持するだけのクラス
  • このクラスから直接「年月日」を取得するメソッドは既に非推奨となっている。
  • 書式を整えるにはDateFormatクラスを使う
SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");
// 11:30以前の場合
if (sdf.parse(data.get(1)).compareTo(sdf.parse("11:30")) <= 0) {
  System.out.println("お昼前だよ");
}
  • Calendar型に変換
    • cal.setTime(date);
  • BigDecimal型のUTCをもとにDate型を作成

    • BigDecimal utc = (BigDecimal) array.get(0);
    • Date day = new Date(utc.longValue());
  • java.sql.Dateに変換する

            public static java.sql.Date toSqlDate(java.util.Date date) {
                return new java.sql.Date(date.getTime());
            }

java.util.Calendar(できれば使わない)

  • 月は0~11
  • Calendar cal = Calendar.getInstance();
  • cal.set(2015,11,31, 0, 0, 0); // 2015/12/31 am0:00
  • cal.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
  • int year = cal.get(Calendar.YEAR);
  • int month = cal.get(Calendar.MONTH) - 1;
  • int date = cal.get(Calendar.DATE);
  • cal.add(Calendar.DAY_OF_MONTH, 1); // 1日加算
  • cal.add(Calendar.DAY_OF_MONTH, -2); // 2日減算
  • cal.add(Calendar.MONTH, 1); // 1か月加算
  • cal.add(Calendar.YEAR, -1); // 1年減算
  • Dateに変換
    • Date date = cal.getTime();
  • java.text.SimpleDateFormat
    • SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HHss");
    • sdf.format(cal.getTime());

時刻を扱う

プログラムの実行時間をはかる

org.apache.commons

build.gradle
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
StopWatch stopWatch = new StopWatch();

// 計測開始
stopWatch.start();

Thread.sleep(500);

// 計測停止
stopWatch.stop();

// 経過時間出力
System.out.println(stopWatch.getTime()); // ⇒500

org.springframework.util.StopWatch

StopWatch stopWatch = new StopWatch();
stopWatch.start();
// ... more
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis());
System.out.println(stopWatch.prettyPrint());

プレーン

    // 全体の「時間:分:秒」
     private String formatedTimeV2(long millis) {
            return String.format("%02d:%02d:%02d", 
                    TimeUnit.MILLISECONDS.toHours(millis),
                    TimeUnit.MILLISECONDS.toMinutes(millis) - 
                    TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis) - 
                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
             );
     }
    // 個別の「分 min, 秒 sec」
    private String formatedTime(long millis) {
        return String.format("%d min, %d sec", 
                TimeUnit.MILLISECONDS.toMinutes(millis),
                TimeUnit.MILLISECONDS.toSeconds(millis) - 
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
            );
    }

    @Test
    public void formatTime() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        System.out.println(formatedTime(end - start));
    }

結果

0 min, 1 sec