スキップしてメイン コンテンツに移動

JavaScriptで日付や時刻を取得して曜日を数値から文字列へと変換する方法

Dateクラスのコンストラクタ関数を使うとDateインスタンスを素早く生成できる。

木の枝に留まる一羽の梟

四つの構文と使用可能なオブジェクト

DateオブジェクトはUTC/協定世界時の1970年1月1日0時0分0秒(UNIXエポック)から始まるミリ秒までの時刻値を基準として持っている。

  • new Date() 無名コンストラクタ:現在のシステム内の日付と時刻
  • new Date(value) value:UNIX時刻(UNIXエポックからの経過秒)
  • new Date("dateString") dateString:IETF準拠のRFC2822の日時指定ISO8601の拡張形式
    ブラウザや書式によって誤差が生じ得る
  • new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds)
    タイムゾーンで扱われる
    必須項目
    • year:年数_主に四桁の整数/一桁と二桁は1900から1999までのマッピング
    • monthIndex:月数_0から11までの整数が一月から十二月までに相当する値 それぞれの数字がずれている
    任意項目
    • day:日数_1から31までの整数
    • hours:時数_0から23までの整数
    • minutes:分数_0から59までの整数
    • seconds:秒数_0から59までの整数
    • milliseconds:ミリ秒数0から999までの整数

日付と時刻の数値データを取得するメソッド

getメソッドの基本的な七種類だけ取り上げている。

  • getFullyear():四桁の年数
  • getMonth():月数
    一月の0で始まって十二月の11で終わる
  • getDate():日数
  • getDay():曜日番
    日曜日の0で始まって土曜日の6で終わる
  • getHours():時数
  • getMinutes():分数
  • getSeconds():秒数

フォーマットのカスタマイズのソースコード

Dateの無名コンストラクタを使ったサンプル

var dt = new Date();
var year = dt.getFullYear();
var month = dt.getMonth() + 1;
var date = dt.getDate();
var day = dt.getDay();
var hour = dt.getHours();
var minute = dt.getMinutes();
var second = dt.getSeconds();
var dow = new Array("日", "月", "火", "水", "木", "金", "土");

月数のgetMonth()は値が一つ少ないから「+1」を付ける。そして曜日は順番の数値ではわかり難いので、文字列に変換すると良いと思う。Arrayクラスのコンストラクタ関数の「new Array」で、曜日の配列の変数を作成しておくと後から対応する曜日の値で取り出せるようになる。

フォーマットの書き出し

document.write(year + "年" + month + "月" + date + "日" + " (" + dow[day] + "曜日) " + hour + "時" + minute + "分" + second + "秒");

サンプルの実行結果

Dateオブジェクトを指定しないとシステム内の現在の日付と時刻と曜日が表示される。

dateStringの日付と時刻の誤差について

Dateクラスのコンストラクタ関数に文字列のdateStringを使った場合はブラウザ毎に日付と時刻に誤差が生じるかも知れない。

parseメソッドで認識可能な形式のRFC2822やISO8601ならば大丈夫だけれどもJavaScriptで日付の文字列の解釈が一律化されてないためなんだ。

ブラウザごとに動作が異なり一貫性がないため、Data コンストラクタ (または同等の Data.perse) で、日付文字列を解釈しないように強くすすめます。RFC 2822 形式の文字列のサポートは、慣例に過ぎません。ISO 8601 フォーマットのサポートは、日付のみの文字列 (例: "1970-01-01") が地方時ではなくUTCとして扱われる点で異なります。

ただしECMAscript(JavaScript標準)5でISO8601の拡張形式の日付と時刻――四桁の年数と二桁の月数と日数を半角ハイフンで区切ってTを置いて二桁の時数と分数と秒数を半角コロンで区切って記載する/例_2018-01-01T01:01:01Z(Zは協定世界時を表す)や2018-01-01T01:01:01+09:00(+はタイムゾーンの追加分を表す)など――はサポートされていてdateStringに使っても誤差は生じないらしい。

日付の文字列は、ISO 8601 の書式になるでしょう。例えば、"2011-10-10" (日付のみ) または "2011-10-10T14:48:00" (日付と時刻) の解釈が可能です。文字列が ISO 8601 の日付のみの場合、UTC タイムゾーンを使用して引用を判断します。文字列が簡略化された ISO 8601 書式の場合、地方時として扱われます。

現行のブラウザの大半はECMAscript5のJavaScriptを読み込むからISO8601の拡張形式を使うかぎりはdateStringでの日時の誤差は生じないといって良いだろう。

すると注意するべきは入力するのが日付のみだとUTCで、日付と時刻だとタイムゾーンを含めて別々に扱われるところだ。

日本の場合、東京だとタイムゾーンで、九時間が追加されるから午後三時以降はUTCよりも日数が増えてしまう。月末ならば月数、年末ならば年数もそれぞれに一つずつ進んでしまうわけで、どちらを使うかを混同しないようにしたい。

コメント

些細な日常の人気の投稿

PlayストアでAndroidアプリのダウンロードが非常に遅い場合の打開策

Imgurで画像URLと埋め込みコードを取得する方法

ジョナサン・モフェットのドラムの8ビートの切れ味の鋭いグルーヴ