Bieżące formatowanie czasu za pomocą JavaScript

101

Chcę uzyskać aktualny czas w określonym formacie za pomocą javascript.

Dzięki poniższej funkcji i wywołaniu to da mi piątek 01 lutego 2013 13:56:40 GMT + 1300 (czas letni w Nowej Zelandii), ale chcę sformatować to tak, jak w piątek 14:00 1 lutego 2013

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

Oczywiście powyższy kod nie ma żadnej logiki formatowania, ale nie znalazłem jeszcze żadnego "działającego" programu formatującego.

Seong Lee
źródło
Podobne pytanie do Node.js można znaleźć na stronie stackoverflow.com/questions/10645994/…
Ohad Schneider

Odpowiedzi:

161

JavaScript Date ma kilka metod umożliwiających wyodrębnienie jej części:

getFullYear()- Zwraca 4-cyfrowy rok
getMonth()- Zwraca liczbę całkowitą od zera (0-11) reprezentującą miesiąc roku.
getDate()- Zwraca dzień miesiąca (1-31).
getDay()- Zwraca dzień tygodnia (0-6). 0 to niedziela, 6 to sobota.
getHours()- Zwraca godzinę dnia (0-23).
getMinutes()- Zwraca minutę (0-59).
getSeconds()- Zwraca sekundę (0-59).
getMilliseconds()- Zwraca milisekundy (0-999).
getTimezoneOffset()- Zwraca liczbę minut między czasem lokalnym maszyny a czasem UTC.

Nie ma wbudowanych metod umożliwiających uzyskanie zlokalizowanych ciągów znaków, takich jak „piątek”, „luty” czy „po południu”. Musisz sam to zakodować. Aby otrzymać żądany ciąg, musisz przynajmniej przechowywać ciąg reprezentujący dni i miesiące:

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

Następnie złóż to razem, korzystając z powyższych metod:

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>

Mam funkcję formatu daty, którą chciałbym dołączyć do mojej standardowej biblioteki. Pobiera parametr ciągu formatu, który definiuje żądane wyjście. Ciągi formatu są luźno oparte na niestandardowych ciągach formatu daty i godziny .Net . Dla formatu określono następujący format string będzie działać: "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");

Demo: jsfiddle.net/BNkkB/1

Oto moja pełna funkcja formatowania daty:

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;
};
gilly3
źródło
Wielkie dzięki. Chociaż mój ostateczny kod wymagał drobnych poprawek, Twoje spostrzeżenia pomogły.
Seong Lee
Jak sformatować datę = "2016/03/01 11:00" to date = "Sat Mar 01 2016 11:00:00 GMT + 0530 (IST)"
Vishal Singh,
Jak MMMM[0]zwraca poprawną nazwę miesiąca zamiast niedrukowalnego znaku w indeksie 0? Nie powinno być MMMM[M]? Czy jestem po prostu głupi? (Nieważne. Ustawia go na niedrukowalny znak, który zastępuje później, aby uniknąć konfliktów)
Danegraphics
190

Możesz spróbować

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

Dokumentacja

Ye Lin Aung
źródło
1
dlaczego twoja metoda nie działa dla mnie? d.toLocaleTimeString()i d.toLocaleTimeString()nie działają.
afzalex
@afzalex, masz na myśli, że nie dostaniesz żadnego zwrotu?
Ye Lin Aung
tak. Nie znalazłem żadnej metody toLocaleTimeString()itoLocaleTimeString()
afzalex
afzalex spróbuj tego: new Date (). toLocaleString ();
jagoda0xff
console.log (new Date (). toLocaleString ()); // 27.09.2015, 14:52:18
blueberry0xff
37

Aktualizacja 2017 : użyj toLocaleDateString i toLocaleTimeString do formatowania dat i godzin. Pierwszym parametrem przekazywanym do tych metod jest wartość ustawień regionalnych, na przykład en-us . Drugi parametr, jeśli jest obecny, określa opcje formatowania, takie jak długi formularz dla dnia tygodnia.

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)); 

Wyjście: środa, 25 października 2017, 20:19

Więcej informacji można znaleźć w poniższym linku

Ciągi daty i godziny (JavaScript)

Joomler
źródło
2
W tej chwili - ponad cztery lata od pierwszych odpowiedzi na to pytanie - jest to obecnie najwygodniejsze i najbardziej elastyczne rozwiązanie i odpowiedź na to pytanie. Powinien być promowany wyżej jako przykład aktualnej (AD 2018) praktyki :-)
Jochem Schulenklopper
Rozdarty. Port strftime @ thdoan wygląda na bardziej elastyczny. Na przykład toLocalTimeStringoferuje 4 style dat full long medium shorti być może znaczenie tych terminów jest gdzieś zdefiniowane. Tymczasem strftime mógłby (prawdopodobnie) dopasować się do każdego z nich i wielu innych. Z drugiej strony toLocalTimeStringobsługuje strefy czasowe. Mam nadzieję, że obejmuje to strefy czasowe, które używają czasu letniego ...
kapitan Puget
14

Możesz użyć mojego portu strftime :

/* 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;
  });
}

Przykładowe użycie:

// 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'));

Najnowszy kod jest dostępny tutaj: https://github.com/thdoan/strftime

thdoan
źródło
To jest niesamowite. Dziękuję bardzo.
PerpetualStudent
7

Spójrz na wewnętrzne elementy klasy Date, a zobaczysz, że możesz wyodrębnić wszystkie bity (datę, miesiąc, rok, godzinę itp.).

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

Na przykład Fri 23:00 1 Feb 2013kod wygląda tak:

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);

**** Zmodyfikowano 29.05.2019, aby zadowolić 3 przeciwników

Lee Meador
źródło
9
w3schools nie jest świetne. Zobacz w3fools . Lepsze źródła referencyjne obejmują MDN i MSDN .
gilly3
Date # getDay zwraca liczbę całkowitą, a nie nazwę dnia tygodnia. Ponadto, imho MDN radzi sobie gorzej z szybkim zrozumieniem obiektu Date, więc nie rozumiem, dlaczego musi mieć miejsce dyskredytacja.
Ninjaxor
Problem date.getMinutes()polega na tym, że zwraca pojedynczą cyfrę, gdy minuty są mniejsze niż 10, co daje czasy takie jak „10:04 rano” zamiast bardziej powszechnego „10:04”.
Jochem Schulenklopper
@JochemSchulenklopper Dodano kod nieaktualny, aby wyświetlić wiodące zero w minutach
Lee Meador
@Ninjaxor Dodano kod niezwiązany z datą, aby przekształcić liczbę w ciąg. To powinno działać, jeśli chcesz używać angielskich nazw.
Lee Meador
4

Istnieje wiele wspaniałych bibliotek dla zainteresowanych

Obecnie nie powinno być potrzeby wymyślania własnych specyfikatorów formatowania.

slf
źródło
Chciałbym tylko wspomnieć, że od października 2017 r. momentJest aktualnym standardem dla rzeczy związanych z czasem w Javascript.
shawon191
dzięki @ shawon191 za aktualizację :) tak, momentskały. d3dodał również trochę czasu, więc jeśli już tego używasz, możesz zapisać bibliotekę import github.com/d3/d3/blob/master/API.md#time-formats-d3-time-format
slf
1

2.39 KB zminimalizowane. Jeden plik. https://github.com/rhroyston/clock-js

Aktualny czas to

var str = clock.month;
var m = str.charAt(0).toUpperCase() + str.slice(1,3); //gets you abbreviated month
clock.weekday + ' ' + clock.time + ' ' + clock.day + ' ' + m + ' ' + clock.year; //"tuesday 5:50 PM 3 May 2016"
Ronnie Royston
źródło
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);

Kryzys
źródło
0

Aby pracować z bazową klasą Date możesz spojrzeć na MDN pod kątem jej metod (zamiast W3Schools z tego powodu ). Można tam znaleźć dobry opis każdej metody przydatnej do uzyskania dostępu do każdego pojedynczego składnika daty / czasu oraz informacje dotyczące tego, czy metoda jest przestarzała, czy nie.

W przeciwnym razie możesz spojrzeć na Moment.js który jest dobrą biblioteką do przetwarzania daty i czasu. Możesz go użyć do manipulowania datą i godziną (na przykład parsowanie, formatowanie, i18n itp.).

Ragnarokkr
źródło
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;

}

Użycie i wynik:

var formattedTime=formatTime(new Date('2020 15:00'));
// Output: "03:00 PM"
Szymon
źródło
0

W tym prawdziwym stylu mysql użyj poniższej funkcji: 2019/02/28 15:33:12

  • Jeśli klikniesz
  • Przycisk „Uruchom fragment kodu” poniżej
  • Pokaże prosty przykład zegara cyfrowego czasu rzeczywistego. Demo pojawi się poniżej fragmentu kodu.

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>

Daniel Lee
źródło
0

ISO8601 (np. HH: MM: SS, 07:55:55 lub 18:50:30) w przeglądarce Chrome:

nowa data (Date.now ()). toTimeString (). substr (0,8);

na krawędzi :

nowa data (Date.now ()). toLocaleTimeString ();

Wael Chorfan
źródło
-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

Umashankar Chaudhary
źródło
Twoja odpowiedź w żaden sposób nie odpowiada na OP.
Sнаđошƒаӽ
Co to jest funkcja checkTime?
Weijing Jay Lin
-4

let date = new Date();
let time = date.format("hh:ss")

Владимир Олейников
źródło
3
Uruchomienie kodu powoduje błąd: Uncaught TypeError: date.format is not a function
Alex Leo