LoginSignup
1
1

More than 3 years have passed since last update.

JavaScript版strftime(組み込みオブジェクトDateの拡張)

Last updated at Posted at 2020-06-18

strftimeって?

PythonやCなどにある、日付オブジェクトのフォーマット関数。あらかじめ決められたキーワードを入力することで、該当箇所が日付のパラメータに置換される。

Python
import datetime

d = datetime.datetime.now()
d.strftime('%Y-%m-%d')
# "2020-06-18"
d.strftime('%c')
# "Thu Jun 18 13:25:31 2020"

使い方

JavaScript
var d = new Date();
d.strftime('%Y-%m-%d')
//"2020-06-18"
d.strftime('%c')
//"Thu Jun 18 13:25:31 2020"

対応指定子

指定子 意味 使用例
%a ロケールの曜日名を短縮形で表示します。 Sun, Mon, ..., Sat
%A ロケールの曜日名を表示します。 Sunday, Monday, ..., Saturday
%w 曜日を10進表記した文字列を表示します。0 が日曜日で、6 が土曜日を表します。 0, 1, ..., 6
%d 0埋めした10進数で表記した月中の日にち。 01, 02, ..., 31
%b ロケールの月名を短縮形で表示します。 Jan, Feb, ..., Dec
%B ロケールの月名を表示します。 January, February, ..., December
%m 0埋めした10進数で表記した月。 01, 02, ..., 12
%y 0埋めした10進数で表記した世紀無しの年。 00, 01, ..., 99
%Y 西暦 (4桁) の 10 進表記を表します。 0001, 0002, ..., 2013, 2014, ..., 9998, 9999
%H 0埋めした10進数で表記した時 (24時間表記)。 00, 01, ..., 23
%I 0埋めした10進数で表記した時 (12時間表記)。 01, 02, ..., 12
%p ロケールの AM もしくは PM と等価な文字列になります。 AM, PM
%M 0埋めした10進数で表記した分。 00, 01, ..., 59
%S 0埋めした10進数で表記した秒。 00, 01, ..., 59
%f 10進数で表記したマイクロ秒 (左側から0埋めされます)。 000000, 000001, ..., 999999
%j 0埋めした10進数で表記した年中の日にち。 001, 002, ..., 366
%c ロケールの日時を適切な形式で表します。 Tue Aug 16 21:30:00 1988
%z UTCオフセットを ±HHMM の形式で表示します -0400, +0900
%Z タイムゾーンの名前を表示します。 "Asia/Irkutsk", "Asia/Seoul", "Asia/Tokyo"
%x ロケールの日付を適切な形式で表します。 2020/08/16
%X ロケールの時間を適切な形式で表します。 21:30:00
%% 文字 '%' を表します。 %

未対応指定子

指定子 意味 使用例
%U 0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。 00, 01, ..., 53
%W 0埋めした10進数で表記した年中の週番号 (週の始まりは月曜日とする)。新年の最初の月曜日に先立つ日は 0週に属するとします。 00, 01, ..., 53

https://docs.python.org/ja/3/library/datetime.html#strftime-strptime-behavior


大元のコード

JavaScript
Date.prototype.strftime = function(s) {
    var a = {
        y: this.getFullYear(),
        m: this.getMonth() + 1,
        d: this.getDate(),
        a: this.getDay(),
        H: this.getHours(),
        M: this.getMinutes(),
        S: this.getSeconds(),
        MS: this.getMilliseconds(),
        _utc: this.getTimezoneOffset() / -60
    }

    var b = Math.floor((new Date() - new Date(a.y,0,1)) / 24 / 60 / 60 / 1000 + 1);
    var loc = {
        "0": ["Africa/Casablanca", "Atlantic/Reykjavik", "Europe/London", "Etc/GMT"],
        "1": ["Europe/Berlin", "Europe/Paris", "Africa/Lagos", "Europe/Budapest", "Europe/Warsaw", "Africa/Windhoek"],
        "2": ["Europe/Istanbul", "Europe/Kiev", "Africa/Cairo", "Asia/Damascus", "Asia/Amman", "Africa/Johannesburg", "Asia/Jerusalem", "Asia/Beirut"],
        "3": ["Asia/Baghdad", "Europe/Minsk", "Asia/Riyadh", "Africa/Nairobi"],
        "4": ["Europe/Moscow", "Asia/Tbilisi", "Asia/Yerevan", "Asia/Dubai", "Asia/Baku", "Indian/Mauritius"],
        "5": ["Asia/Tashkent", "Asia/Karachi"],
        "6": ["Asia/Almaty", "Asia/Dhaka", "Asia/Yekaterinburg"],
        "7": ["Asia/Bangkok", "Asia/Novosibirsk"],
        "8": ["Asia/Krasnoyarsk", "Asia/Ulaanbaatar", "Asia/Shanghai", "Australia/Perth", "Asia/Singapore", "Asia/Taipei"],
        "9": ["Asia/Irkutsk", "Asia/Seoul", "Asia/Tokyo"],
        "10": ["Australia/Hobart", "Asia/Yakutsk", "Australia/Brisbane", "Pacific/Port_Moresby", "Australia/Sydney"],
        "11": ["Asia/Vladivostok", "Pacific/Guadalcanal"],
        "12": ["Etc/GMT-12", "Pacific/Fiji", "Asia/Magadan", "Pacific/Auckland"],
        "13": ["Pacific/Tongatapu", "Pacific/Apia"],
        "-12": ["Etc/GMT+12"],
        "-11": ["Etc/GMT+11"],
        "-10": ["Pacific/Honolulu"],
        "-9": ["America/Anchorage"],
        "-8": ["America/Santa_Isabel", "America/Los_Angeles"],
        "-7": ["America/Chihuahua", "America/Phoenix", "America/Denver"],
        "-6": ["America/Guatemala", "America/Chicago", "America/Regina", "America/Mexico_City"],
        "-5": ["America/Bogota", "America/Indiana/Indianapolis", "America/New_York"],
        "-4.5": ["America/Caracas"],
        "-4": ["America/Halifax", "America/Asuncion", "America/La_Paz", "America/Cuiaba", "America/Santiago"],
        "-3.5": ["America/St_Johns"],
        "-3": ["America/Sao_Paulo", "America/Godthab", "America/Cayenne", "America/Argentina/Buenos_Aires", "America/Montevideo"],
        "-2": ["Etc/GMT+2"],
        "-1": ["Atlantic/Cape_Verde", "Atlantic/Azores"],
        "3.5": ["Asia/Tehran"],
        "4.5": ["Asia/Kabul"],
        "5.5": ["Asia/Colombo", "Asia/Kolkata"],
        "5.75": ["Asia/Kathmandu"],
        "6.5": ["Asia/Yangon"],
        "9.5": ["Australia/Darwin", "Australia/Adelaide"]
    };
    var dict = {
        d: ("0" + a.d).slice(-2),
        m: ("0" + a.m).slice(-2),
        y: String(a.y).slice(-2),
        Y: String(a.y),
        H: ("0" + a.H).slice(-2),
        I: ("0" + (a.H % 12)).slice(-2),
        p: a.H < 12 ? "AM" : "PM",
        M: ("0" + a.M).slice(-2),
        S: ("0" + a.S).slice(-2),
        f: ("00" + a.MS + "000").slice(-6),
        A: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][a.a],
        a: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][a.a],
        B: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][a.m - 1],
        b: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][a.m - 1],
        w: String(a.a),
        j: ("00" + b).slice(-3),
        z: (a._utc < 0 ? "-" : "+") + ("0" + Math.floor(a._utc * (a._utc < 0 ? -1 : 1))).slice(-2) + ("0" + (a._utc % 1 * 60)).slice(-2),
        Z: loc[String(a._utc)].join(", "),
        "%": "%"
    };
    dict.c = dict.a + " " + dict.b + " " + dict.d + " " + dict.H + ":" + dict.M + ":" + dict.S + " " + dict.Y;
    dict.x = dict.Y + "/" + dict.m + "/" + dict.d;
    dict.X = dict.H + ":" + dict.M + ":" + dict.S;

    return s.replace(/%([a-zA-Z%])/g, function(a, b) {
        return dict[b] || a;
    });
}
1
1
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
1
1