◆PROCESSING 逆引きリファレンス
カテゴリー:演算処理
日付を扱うには
【解説】
PROCESSINGはJavaをベースにした言語ですので、日付の処理に関してはJavaの命令がそのまま利用可能です。
PROCESSINGで日付を扱うには、基本的にはJavaの命令を利用します。ですが単純に年月日時分秒が得たいだけなら、PROCESSINGの独自命令で簡単に取得する事も可能です。
下記では、PROCESSINGとJavaによる日付取得方法について紹介します。
なおJavaの命令で日付を扱う事に関しては、下記サイト様などに詳しく掲載されていますので、本格的に日付を扱いたい方は参考としてみて下さい。
- Java8の日時APIはとりあえずこれだけ覚えとけ:Qiita 様(tag1216さん)
- Java8日時APIのちょっと特殊なクラスたち:Qiita 様(tag1216さん)
- mike-neckのブログ 様
【構文】
PROCESSINGで日付を扱う命令
●年月日時分秒を取得する
int y = year( ) ; // 2017
int m = month( ) ; // 1 – 12
int d = day( ) ; // 1 – 31
int h = hour( ) ; // 1 – 23
int mi = minute( ) ; // 0 – 59
int s = second( ) ; // 0 – 59
Javaで日付を扱う代表的な命令
●ローカル日付を取得する
LocalDateTime ldt = LocalDateTime . now( ) ; // 2017-09-16T23:30:59.999
●日付型⇒書式文字列
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern( “yyyy/MM/dd(EEEE) HH:mm:ss SSS” ) ;
String localStr = dtf1 . format( ldt ) ; // 2017/09/16(土曜日) 23:30:59.999
●書式文字列⇒日付型
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern( “yyyy/MM/dd HH:mm:ss” ) ;
LocalDateTime fd = LocalDateTime . parse( “2017/12/25(月曜日) 23:30:59 000”, dtf2 ) ;
●日付時刻の加算
LocalDateTime addDay = ldt . plusYears( 1 ) . plusMonths( 2 ) . plusDays( 3 ) ;
LocalDateTime addHour = ldt . plusHours( 1 ) . plusMinutes( 2 ) . plusSeconds( 3 ) ;
●日付時刻の減算
LocalDateTime delDay = ldt . minusYears( 1 ) . minusMonths( 2 ) . minusDays( 3 ) ;
LocalDateTime delHour = ldt . minusHours( 1 ) . minusMinutes( 2 ) . minusSeconds( 3 ) ;
●和暦を取得する
JapaneseDate jpd = JapaneseDate.from( ldt ) ;
DateTimeFormatter jpf = DateTimeFormatter.ofPattern( “Gyy年MM月dd日” ) ;
String japanStr = jpd.format( jpf ); //平成29年09月16日
●曜日番号を取得する
int an = ldt . get( ChronoField . DAY_OF_WEEK ) ; // 曜日番号 月曜=1、日曜=7
●ミリセカンドを取得する
int ms = ldt . get( ChronoField . MILLI_OF_SECOND ) ; // 000 – 999
●年月日時分秒ナノセカンドを取得する
int y = ldt . getYear( ) ; // 2017
int m = ldt . getMonthValue( ) ; // 1 – 12
int d = ldt . getDayOfMonth( ) ; // 1 – 31
int h = ldt . getHour( ) ; // 1 – 23
int mi = ldt . getMinute( ) ; // 0 – 59
int s = ldt . getSecond( ) ; // 0 – 59
int ns = ldt . getNano( ) ; // 000000000 – 999999999
【注意】
PROCESSINGには、「現在のミリセカンド」を取得する命令はありません。millis( ) という命令がありますが、これはPROCESSINGのアプリケーションを起動してからの通算ミリ秒です。現在時刻ではありませんので、注意してください。
PROCESSINGには現在日時を取得する簡易な命令しかありません。日付の加算・減算(XX月YY日からn日後など)を計算したい場合や、タイムゾーンを意識した時刻を扱いたい場合は、素直にJavaの命令を利用しましょう。
ただし、Java8から日付を扱う命令が大きく変更になりました。Java7以前を利用される方は、ここで紹介した命令は使えないので注意してください。
Javaの命令を利用すれば、和暦を取得する事も可能です。ただし JapaneseDate では明治、大正、昭和、平成の元号のみをサポートし、かつ明治6年1月1日以前は扱うことができません。
JapaneseDateで、明治6年1月1日より前の日付を扱おうとすると「DateTimeException : JapaneseDate Before MEiji 6 is not supported」例外が発生します。
なんでそんなに中途半端なんだ・・・と調べてみたら、日本では明治5年12月2日(1872年12月31日)までは、旧暦(太陰太陽暦)を採用していたんですね。
- 参考:海上保安庁 海洋情報部 様(http://www1.kaiho.mlit.go.jp/KOHO/faq/reki/rekicyuu.html)
で、その翌日からグレゴリオ暦(太陽暦)に移行し、明治6年(1873年)1月1日となりました。つまりJapaneseDate は、旧暦には対応していないという事になります。
またJava8のLocalDateTime . parseには不具合があり、”yyyyMMddHHmmssSSS” 形式の文字列を日付型に変換する事ができません(汗)。
変換したい場合は、”yyyyMMddHHmmss.SSS” のように、ミリセカンドの前にピリオドを入れたり、”yyyy/MM/ddHHmmssSSS” のように、日付の後ろにスラッシュを入れる必要があります。
本件に関しては、下記サイト様に情報が掲載されていました。
【関連記事】
- なし
サンプルプログラム
PROCESSINGで年月日時分秒を取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup(){ int py = year(); int pm = month(); int pd = day(); int ph = hour(); int pmi = minute(); int ps = second(); int pms = millis(); println( "今日は:" + py + "/" + pm + "/" + pd + " " + ph + ":" + pmi + ":" + ps ); println( "PROCESSING起動から " + pms + " ms経過" ); } void draw(){ } |
PROCESSINGの独自命令で、年月日時分秒を取得して表示しています。millis() は現在のミリセカンドではなく、経過時間である事に注意してください。
Java8でローカル日付を取得する例:
1 2 3 4 5 6 7 8 9 |
import java.time.LocalDateTime; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now(); println( "今日は:" + ldt ); } void draw(){ } |
ローカル日付を取得して表示しています。
日付は、デフォルトでは YYYY-MM-DDTHH:MI:SS.NNN 形式となります。
Java8で日付型を文字列に変換する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now() ; //日付型を書式指定で文字列に変換 //EEEE を E にすると 2017/09/17(日) のように「曜日」の表記がなくなる DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern( "yyyy/MM/dd(EEEE) HH:mm:ss SSS" ) ; String localStr = dtf1.format( ldt ) ; println( "今日は:" + localStr ); } void draw(){ } |
得られたローカル日付を、文字列化しています。EEEEは曜日、SSSはミリセカンドを得るための書式です。大文字小文字に意味がありますので、注意してください。
書式については、下記公式リファレンスを参考としてください。
Java8で書式文字列を日付型に変換する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; void setup(){ //変換したい文字列の書式を指定 DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern( "yyyy/MM/dd HH:mm:ss.SSS" ) ; //文字列を日付型に変換 LocalDateTime fd = LocalDateTime.parse( "2015/12/25 23:30:59.000", dtf2 ) ; println( "文字列を日付型に:" + fd ); } void draw(){ } |
前述サンプルの逆パターンですね。文字列から日付型の値を得ます。
文字列は、DateTimeFormatter.ofPatternで指定した形式じゃないと変換時に例外となるので注意してください。
Java8で日付の加算を行う例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now(); println( "今日は:" + ldt ); //ローカル日時に日付を加算 LocalDateTime addDay = ldt .plusYears( 1 ) .plusMonths( 2 ) .plusDays( 3 ); println( "今日から1年2ヶ月3日後は:" + addDay ); //ローカル日時に時間を加算 LocalDateTime addHour = ldt .plusHours( 1 ) .plusMinutes( 2 ) .plusSeconds( 3 ); println( "今から1時間2分3秒後は:" + addHour ); } void draw(){ } |
現在日時に、年月日や時分秒を加算しています。
Java8で日付の減算を行う例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now(); println( "今日は:" + ldt ); //ローカル日時に日付を減算 LocalDateTime addDay = ldt .minusYears( 1 ) .minusMonths( 2 ) .minusDays( 3 ); println( "今日から1年2ヶ月3日前は:" + addDay ); //ローカル日時に時間を減算 LocalDateTime addHour = ldt .minusHours( 1 ) .minusMinutes( 2 ) .minusSeconds( 3 ); println( "今から1時間2分3秒前は:" + addHour ); } void draw(){ } |
LocalDateTime . plus ではなく .minus を利用すると、年月日や時分秒の減算を行うことが可能です。
Java8で和暦を表示する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.chrono.JapaneseDate; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now(); //ローカル日時を和暦表示 JapaneseDate jpd = JapaneseDate.from( ldt ) ; DateTimeFormatter jpf = DateTimeFormatter.ofPattern( "Gyy年MM月dd日" ) ; String japanStr = jpd.format( jpf ); println( "今日は:" + japanStr ); } void draw(){ } |
ローカル日時を和暦表記に変換して表示しています。
一見便利そうですが、明治5年以前に対応していなかったり、新元号が登場した場合に変更が必要だったりと・・・意外と使えない子かもしれません(汗)。
Java8で年月日時分秒を取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.chrono.JapaneseDate; import java.time.temporal.ChronoField; void setup(){ //ローカル日時取得 LocalDateTime ldt = LocalDateTime.now(); int y = ldt.getYear() ; int m = ldt.getMonthValue() ; int d = ldt.getDayOfMonth() ; int h = ldt.getHour() ; int mi = ldt.getMinute() ; int s = ldt.getSecond() ; int ns = ldt.getNano() ; int an = ldt.get( ChronoField . DAY_OF_WEEK ) ; int ms = ldt.get( ChronoField . MILLI_OF_SECOND ) ; println( "今日は:" + y + m + d + " " + h + mi + s + " " + ms + " " + ns ); switch( an ){ case 1: println("月曜日。Mondayはローマ神話の月神ルナの日(Moon day)です"); break; case 2: println("火曜日。Tuesdayは北欧神話の軍人Tyr(チュール)の日です"); break; case 3: println("水曜日。Wednesdayは北欧神話の主神Odin(オーディン)の日です"); break; case 4: println("木曜日。Thursdayは北欧神話の神Thor(トール)の日です"); break; case 5: println("金曜日。Fridayは北欧神話の女神Freija(フレイヤ)の日です"); break; case 6: println("土曜日。Saturdayはローマ神話の農耕神Saturnus(サトゥルヌス)の日です"); break; case 7: println("日曜日。Sundayは太陽の日(Sun day)です"); break; default: println("・・・マジですか、それ?。"); break; } } void draw(){ } |
ローカル日時をベースに、年月日時分秒などを値として取得しています。
曜日とミリセカンドの取得方法が特殊なので、注意してください。
各曜日の意味は、以下のサイト様を参考にさせて頂きました。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。