[Java] 日付フォーマット(SimpleDateFormat)を使う方法


Devlopment note / Java    作成日付 : 2020/03/25 00:36:53   修正日付 : 2020/03/25 00:36:53

こんにちは。明月です。


この投稿はJavaで日付フォーマットを使う方法に関する説明です。


以前、Javaで数字フォーマットに関して説明したことがあります。

link - [Java] 数字フォーマット(お金表示及び小数点以下表示)

その時には数字フォーマットのDecimalFormatを使いましたが、データフォーマットはDateformatを使います。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DataFormatExample {
  // 実行関数
  public static void main(String[] args) {
    try {
      // 日付形式をStringに変換、またはStringを日付形式に変換するフォーマットクラスだ。
      DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
      // Calendar形式で日付を取得する。
      // Date値を取得してStringに変換する。
      String datestr = format.format(Calendar.getInstance().getTime());
      // コンソール出力
      System.out.println(datestr);

      // DateオブジェクトからStringに変換する。
      datestr = format.format(new Date());
      // コンソール出力
      System.out.println(datestr);

      // String形式からDate形式に変換する。
      Date date = format.parse("2020/03/24");
      // コンソール出力
      System.out.println(date);
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
}


Date形式からStringに変換、またはStringからDate形式に変換することはSimpleDateFormatクラスです。

SimpleDateFormatのフォーマットパターンは下記とおりになります。

link - https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

文字 日付及び時間コンポーネント 表示
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00

上のフォーマットパターンの例です。

日付及び時間パターン 結果
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3

JavaでDateクラスを取得する方法は二つがあります。

「Calendar.getInstance().getTime()」と「new Date」です。

一応、お勧めの方法はCalendarクラスを通ってgetTime関数で取得することです。


なぜなら、時間というオブジェクトはインスタンスを生成することを考えば合ってる話しになるし、間違っている話もなります。Systemで流れる時間はローカルシステムから取得するデータです。

そのデータをnewで割り当てして取得することは間違ってる概念だと思われます。でも、流れる時間で特定時間をオブジェクト化して取得することだと思えば、間違っていない概念です。

なのでJavaではDateクラスを「new」で生成することは無駄なメモリリソースだし、バグ発生の可能性が高いと判断するでしょう。


簡単に説明すると「new Date」の場合は特定な日付を生成することには使うし、現在の時間を取得する時にはCalendarを通って取得して使うという意味です。

link - https://stackoverflow.com/questions/368094/system-currenttimemillis-vs-new-date-vs-calendar-getinstance-gettime

link - https://stackoverflow.com/questions/20693131/difference-between-new-date-and-calendar-date/20693309


私も率直に言って詳しい差異まで知りません。ただJavaAPIから現在日付はCalendarから取得することをお勧めだというのでユーザの場合はAPI通りに設計することがバグ発生可能性を低くすることです。


ここまでJavaで日付フォーマットを使う方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿