Форматування поточного часу за допомогою Javascript


101

Я хочу отримати поточний час у визначеному форматі за допомогою JavaScript.

Функція нижче та її виклик дасть мені пт 01 лютого 2013 13:56:40 GMT + 1300 (літній час Нової Зеландії), але я хочу її відформатувати, як п’ятниця, 14:00 1 лютого 2013

var d = new Date();
var x = document.getElementById("time");
x.innerHTML = d;

Звичайно, код вище не має жодної логіки форматування, але я ще не стикався з жодними "робочими" форматерами.


Для подібного питання щодо Node.js дивіться stackoverflow.com/questions/10645994/…
Охад Шнайдер

Відповіді:


160

Дата JavaScript має кілька методів, які дозволяють витягти її частини:

getFullYear()- Повертає чотиризначний рік
getMonth()- Повертає нульове ціле число (0-11), що представляє місяць року.
getDate()- Повертає день місяця (1-31).
getDay()- Повертає день тижня (0-6). 0 - неділя, 6 - субота.
getHours()- Повертає годину дня (0-23).
getMinutes()- Повертає хвилину (0-59).
getSeconds()- Повертає друге (0-59).
getMilliseconds()- Повертає мілісекунди (0-999).
getTimezoneOffset()- Повертає кількість хвилин між місцевим часом машини та UTC.

Немає вбудованих методів, що дозволяють отримати локалізовані рядки, такі як "П'ятниця", "Лютий" або "ПМ". Ви самі повинні це кодувати. Щоб отримати потрібний рядок, вам потрібно принаймні зберігати представлення рядків днів і місяців:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

Потім складіть це разом, використовуючи наведені вище методи:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var d = new Date();
var day = days[d.getDay()];
var hr = d.getHours();
var min = d.getMinutes();
if (min < 10) {
    min = "0" + min;
}
var ampm = "am";
if( hr > 12 ) {
    hr -= 12;
    ampm = "pm";
}
var date = d.getDate();
var month = months[d.getMonth()];
var year = d.getFullYear();
var x = document.getElementById("time");
x.innerHTML = day + " " + hr + ":" + min + ampm + " " + date + " " + month + " " + year;
<span id="time"></span>

У мене є функція форматування дати, яку я хотів би включити в свою стандартну бібліотеку. Він бере параметр рядка формату, який визначає бажаний вихід. Рядки формату є вільно на основі .Net користувальницької Дати і формат рядок часу . Для формату ви вказали наступний рядок формату буде працювати: "dddd h:mmtt d MMM yyyy".

var d = new Date();
var x = document.getElementById("time");
x.innerHTML = formatDate(d, "dddd h:mmtt d MMM yyyy");

Демонстрація: jsfiddle.net/BNkkB/1

Ось моя повна функція форматування дати:

function formatDate(date, format, utc) {
    var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var MMM = ["\x01", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var dddd = ["\x02", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var ddd = ["\x03", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

    function ii(i, len) {
        var s = i + "";
        len = len || 2;
        while (s.length < len) s = "0" + s;
        return s;
    }

    var y = utc ? date.getUTCFullYear() : date.getFullYear();
    format = format.replace(/(^|[^\\])yyyy+/g, "$1" + y);
    format = format.replace(/(^|[^\\])yy/g, "$1" + y.toString().substr(2, 2));
    format = format.replace(/(^|[^\\])y/g, "$1" + y);

    var M = (utc ? date.getUTCMonth() : date.getMonth()) + 1;
    format = format.replace(/(^|[^\\])MMMM+/g, "$1" + MMMM[0]);
    format = format.replace(/(^|[^\\])MMM/g, "$1" + MMM[0]);
    format = format.replace(/(^|[^\\])MM/g, "$1" + ii(M));
    format = format.replace(/(^|[^\\])M/g, "$1" + M);

    var d = utc ? date.getUTCDate() : date.getDate();
    format = format.replace(/(^|[^\\])dddd+/g, "$1" + dddd[0]);
    format = format.replace(/(^|[^\\])ddd/g, "$1" + ddd[0]);
    format = format.replace(/(^|[^\\])dd/g, "$1" + ii(d));
    format = format.replace(/(^|[^\\])d/g, "$1" + d);

    var H = utc ? date.getUTCHours() : date.getHours();
    format = format.replace(/(^|[^\\])HH+/g, "$1" + ii(H));
    format = format.replace(/(^|[^\\])H/g, "$1" + H);

    var h = H > 12 ? H - 12 : H == 0 ? 12 : H;
    format = format.replace(/(^|[^\\])hh+/g, "$1" + ii(h));
    format = format.replace(/(^|[^\\])h/g, "$1" + h);

    var m = utc ? date.getUTCMinutes() : date.getMinutes();
    format = format.replace(/(^|[^\\])mm+/g, "$1" + ii(m));
    format = format.replace(/(^|[^\\])m/g, "$1" + m);

    var s = utc ? date.getUTCSeconds() : date.getSeconds();
    format = format.replace(/(^|[^\\])ss+/g, "$1" + ii(s));
    format = format.replace(/(^|[^\\])s/g, "$1" + s);

    var f = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
    format = format.replace(/(^|[^\\])fff+/g, "$1" + ii(f, 3));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])ff/g, "$1" + ii(f));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])f/g, "$1" + f);

    var T = H < 12 ? "AM" : "PM";
    format = format.replace(/(^|[^\\])TT+/g, "$1" + T);
    format = format.replace(/(^|[^\\])T/g, "$1" + T.charAt(0));

    var t = T.toLowerCase();
    format = format.replace(/(^|[^\\])tt+/g, "$1" + t);
    format = format.replace(/(^|[^\\])t/g, "$1" + t.charAt(0));

    var tz = -date.getTimezoneOffset();
    var K = utc || !tz ? "Z" : tz > 0 ? "+" : "-";
    if (!utc) {
        tz = Math.abs(tz);
        var tzHrs = Math.floor(tz / 60);
        var tzMin = tz % 60;
        K += ii(tzHrs) + ":" + ii(tzMin);
    }
    format = format.replace(/(^|[^\\])K/g, "$1" + K);

    var day = (utc ? date.getUTCDay() : date.getDay()) + 1;
    format = format.replace(new RegExp(dddd[0], "g"), dddd[day]);
    format = format.replace(new RegExp(ddd[0], "g"), ddd[day]);

    format = format.replace(new RegExp(MMMM[0], "g"), MMMM[M]);
    format = format.replace(new RegExp(MMM[0], "g"), MMM[M]);

    format = format.replace(/\\(.)/g, "$1");

    return format;
};

Дуже дякую. Хоча в моєму остаточному коді потрібно було трохи переробити, ваше розуміння допомогло.
Seong Lee

Як я відформатую дату = "01.03.2016 11:00" до дати = "Сб Мар 01 2016 11:00:00 GMT + 0530 (IST)"
Вішал Сінгх

Як MMMM[0]повернути правильну назву місяця замість недрукуваного символу в індексі 0? Чи не повинно бути MMMM[M]? Чи просто я німий? (Nevermind. Це встановлює його для
недрукуваного

190

Ви можете спробувати

var d = new Date();
d.toLocaleString();       // -> "2/1/2013 7:37:08 AM"
d.toLocaleDateString();   // -> "2/1/2013"
d.toLocaleTimeString();  // -> "7:38:05 AM"

Документація


1
чому ваш метод не працює для мене? d.toLocaleTimeString()і d.toLocaleTimeString()не працюють.
afzalex

@afzalex ти маєш на увазі, що не отримуєш жодної віддачі?
Ye Lin Aung

так. Я не знайшов жодного методу toLocaleTimeString()іtoLocaleTimeString()
afzalex

afzalex спробуйте це: new Date (). toLocaleString ();
blueberry0xff

console.log (нова дата (). toLocaleString ()); // 27.09.2015, 14:52:18
blueberry0xff

37

Оновлення 2017 року : використовуйте toLocaleDateString та toLocaleTimeString для форматування дат та часу. Перший параметр, переданий цим методам, - це значення локального значення, наприклад, en-us . Другий параметр, де він присутній, визначає параметри форматування, такі як довга форма для буднього дня.

let date = new Date();  
let options = {  
    weekday: "long", year: "numeric", month: "short",  
    day: "numeric", hour: "2-digit", minute: "2-digit"  
};  

console.log(date.toLocaleTimeString("en-us", options)); 

Вихід: середа, 25 жовтня 2017 р., 20:19

Будь ласка, перегляньте посилання нижче для отримання більш детальної інформації

Рядки дати та часу (JavaScript)


2
У цей час - через чотири роки після перших відповідей на це питання - це зараз найзручніше і гнучкіше рішення та відповідь на це питання. Його слід підвищувати як приклад поточної практики (AD 2018) :-)
Джохем Шуленклоппер,

Розірваний. Порт стрилону @ thdoan виглядає більш гнучким. Наприклад, toLocalTimeStringпропонує 4 стилі дати,full long medium short , і, можливо, те, що означають ці терміни, десь визначено. Тим часом, стрифлінг (мабуть) може відповідати будь-якому з цих та багатьох інших. З іншого боку, toLocalTimeStringпідтримує часові пояси. Я сподіваюся, що це включає часові пояси, які використовують літній час ...
Капітан puget

14

Ви можете використовувати мій порт strroll :

/* Port of strftime(). Compatibility notes:
 *
 * %c - formatted string is slightly different
 * %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
 * %e - space is not added
 * %E - not implemented
 * %h - not implemented (use "%b")
 * %k - space is not added
 * %n - not implemented (use "\n")
 * %O - not implemented
 * %r - not implemented (use "%I:%M:%S %p")
 * %R - not implemented (use "%H:%M")
 * %t - not implemented (use "\t")
 * %T - not implemented (use "%H:%M:%S")
 * %U - not implemented
 * %W - not implemented
 * %+ - not implemented
 * %% - not implemented (use "%")
 *
 * strftime() reference:
 * http://man7.org/linux/man-pages/man3/strftime.3.html
 *
 * Day of year (%j) code based on Joe Orost's answer:
 * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek's prototype:
 * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
 */
function strftime(sFormat, date) {
  if (!(date instanceof Date)) date = new Date();
  var nDay = date.getDay(),
    nDate = date.getDate(),
    nMonth = date.getMonth(),
    nYear = date.getFullYear(),
    nHour = date.getHours(),
    aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
    isLeapYear = function() {
      if ((nYear&3)!==0) return false;
      return nYear%100!==0 || nYear%400===0;
    },
    getThursday = function() {
      var target = new Date(date);
      target.setDate(nDate - ((nDay+6)%7) + 3);
      return target;
    },
    zeroPad = function(nNum, nPad) {
      return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
    };
  return sFormat.replace(/%[a-z]/gi, function(sMatch) {
    return {
      '%a': aDays[nDay].slice(0,3),
      '%A': aDays[nDay],
      '%b': aMonths[nMonth].slice(0,3),
      '%B': aMonths[nMonth],
      '%c': date.toUTCString(),
      '%C': Math.floor(nYear/100),
      '%d': zeroPad(nDate, 2),
      '%e': nDate,
      '%F': date.toISOString().slice(0,10),
      '%G': getThursday().getFullYear(),
      '%g': ('' + getThursday().getFullYear()).slice(2),
      '%H': zeroPad(nHour, 2),
      '%I': zeroPad((nHour+11)%12 + 1, 2),
      '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
      '%k': '' + nHour,
      '%l': (nHour+11)%12 + 1,
      '%m': zeroPad(nMonth + 1, 2),
      '%M': zeroPad(date.getMinutes(), 2),
      '%p': (nHour<12) ? 'AM' : 'PM',
      '%P': (nHour<12) ? 'am' : 'pm',
      '%s': Math.round(date.getTime()/1000),
      '%S': zeroPad(date.getSeconds(), 2),
      '%u': nDay || 7,
      '%V': (function() {
              var target = getThursday(),
                n1stThu = target.valueOf();
              target.setMonth(0, 1);
              var nJan1 = target.getDay();
              if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
              return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
            })(),
      '%w': '' + nDay,
      '%x': date.toLocaleDateString(),
      '%X': date.toLocaleTimeString(),
      '%y': ('' + nYear).slice(2),
      '%Y': nYear,
      '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
      '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
    }[sMatch] || sMatch;
  });
}

Використання зразка:

// Returns "Thursday 4:45pm 15 Sep 2016"
strftime('%A %l:%M%P %e %b %Y');

// You can optionally pass it a Date object
// Returns "Friday 2:00pm 1 Feb 2013"
strftime('%A %l:%M%P %e %b %Y', new Date('Feb 1, 2013 2:00 PM'));

Останній код доступний тут: https://github.com/thdoan/strearch


Це круто. Дуже дякую.
PerpetualStudent

7

Погляньте на внутрішні класи класу Дата і побачите, що ви можете витягти всі біти (дата, місяць, рік, година тощо).

http://www.w3schools.com/jsref/jsref_obj_date.asp

Для Fri 23:00 1 Feb 2013коду щось подібне:

date = new Date();

weekdayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var dateString = weekdayNames[date.getDay()] + " " 
    + date.getHours() + ":" + ("00" + date.getMinutes()).slice(-2) + " " 
    + date.getDate() + " " + monthNames[date.getMonth()] + " " + date.getFullYear();

console.log(dateString);

**** Модифікований 2019-05-29, щоб тримати три щасливих потоків


9
w3schools не велике. Дивіться w3fools . Кращі довідкові джерела включають MDN та MSDN .
gilly3

Дата # getDay повертає ціле число, а не назву будня. Крім того, imho MDN погіршує швидке проходження точки щодо об'єкта Date, тому я не розумію, чому потрібно зневажитись.
Ninjaxor

Проблема date.getMinutes()полягає в тому, що він повертає одну цифру, коли хвилин менше 10, що призводить до таких випадків, як "10: 4 ранку" замість звичайнішого "10:04 ранку".
Йохім Шуленклоппер

@JochemSchulenklopper Додано код не дати, щоб відобразити провідний нуль на хвилинах
Лі Медор

@Ninjaxor Додано не пов'язаний з датою код для перетворення числа в рядок. Це має спрацювати, якщо ви хочете англійських імен.
Лі Меадор

4

Там багато чудових бібліотек для тих, хто цікавиться

Сьогодні справді не повинно виникати необхідності вигадувати власні специфікатори форматування.


Щойно хотілося згадати, станом на жовтень 2017 року moment- це поточний стандарт для речей, пов’язаних із часом у Javascript.
shawon191

дякую @ shawon191 за оновлення :) так, momentскелі. d3також додав деякі відомості про час, тому, якщо ви вже використовуєте це, ви зможете зберегти імпорт бібліотеки github.com/d3/d3/blob/master/API.md#time-formats-d3-time-format
slf


1

d = Date.now();
d = new Date(d);
d = (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear()+' '+(d.getHours() > 12 ? d.getHours() - 12 : d.getHours())+':'+d.getMinutes()+' '+(d.getHours() >= 12 ? "PM" : "AM");

console.log(d);


0

Для роботи з базовим класом Date ви можете подивитися на MDN для його методів (замість W3Schools через цю причину ). Там ви можете знайти хороший опис кожного методу, корисного для доступу до кожного компонента дати / часу та інформації щодо того, чи метод є застарілим чи ні.

В іншому випадку ви можете подивитися на Moment.js, який є гарною бібліотекою, яку можна використовувати для обробки дати та часу. Ви можете використовувати його для маніпулювання датою та часом (наприклад, розбір, форматування, i18n тощо).


0
function formatTime(date){

  d = new Date(date);
  var h=d.getHours(),m=d.getMinutes(),l="AM";
  if(h > 12){
    h = h - 12;
  }
  if(h < 10){
    h = '0'+h;
  }
  if(m < 10){
    m = '0'+m;
  }
  if(d.getHours() >= 12){
    l="PM"
  }else{
    l="AM"
  }

  return h+':'+m+' '+l;

}

Використання та результат:

var formattedTime=formatTime(new Date('2020 15:00'));
// Output: "03:00 PM"

0

Для цього справжнього стилю mysql використовуйте цю функцію нижче: 2019/02/28 15:33:12

  • Якщо ви натиснете на
  • Кнопка "Запустити фрагмент коду" нижче
  • Він покаже простий приклад цифрового годинника в реальному часі. Демонстрація демонструється під фрагментом коду.

function getDateTime() {
        var now     = new Date(); 
        var year    = now.getFullYear();
        var month   = now.getMonth()+1; 
        var day     = now.getDate();
        var hour    = now.getHours();
        var minute  = now.getMinutes();
        var second  = now.getSeconds(); 
        if(month.toString().length == 1) {
             month = '0'+month;
        }
        if(day.toString().length == 1) {
             day = '0'+day;
        }   
        if(hour.toString().length == 1) {
             hour = '0'+hour;
        }
        if(minute.toString().length == 1) {
             minute = '0'+minute;
        }
        if(second.toString().length == 1) {
             second = '0'+second;
        }   
        var dateTime = year+'/'+month+'/'+day+' '+hour+':'+minute+':'+second;   
         return dateTime;
    }

    // example usage: realtime clock
    setInterval(function(){
        currentTime = getDateTime();
        document.getElementById("digital-clock").innerHTML = currentTime;
    }, 1000);
<div id="digital-clock"></div>


0

ISO8601 (наприклад: HH: MM: SS, 07:55:55 або 18:50:30) для хрому:

нова дата (Date.now ()) .TTimeString (). substr (0,8);

на межі :

нова дата (Date.now ()). toLocaleTimeString ();


-2
function startTime() {
    var today = new Date(),
        h = checkTime(((today.getHours() + 11) % 12 + 1)),
        m = checkTime(today.getMinutes()),
        s = checkTime(today.getSeconds());
    document.getElementById('demo').innerHTML = h + ":" + m + ":" + s;
    t = setTimeout(function () {
        startTime()
    }, 500);
}
startTime();

}) ();

05:12:00


Ваша відповідь жодним чином не відповідає ОП.
Snađошƒаӽ

Що таке функція checkTime?
Векін Джей Лін

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.