【问题标题】:Current time formatting with Javascript使用 Javascript 格式化当前时间
【发布时间】:2013-01-16 06:38:20
【问题描述】:

我想使用 javascript 以特定格式获取当前时间。

使用下面的函数并调用它会给我 2013 年 2 月 1 日星期五 13:56:40 GMT+1300(新西兰夏令时间) 但我想像这样格式化它 星期五下午 2:00 2013 年 2 月 1 日

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

当然,上面的代码没有任何格式化逻辑,但我还没有遇到任何“工作”的格式化程序。

【问题讨论】:

标签: javascript date time format


【解决方案1】:

你可以试试

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

Documentation

【讨论】:

  • 为什么你的方法对我不起作用? d.toLocaleTimeString()d.toLocaleTimeString() 不起作用。
  • @afzalex 你的意思是你没有得到任何回报?
  • 是的。我没有找到任何方法toLocaleTimeString()toLocaleTimeString()
  • afzalex 试试这个:new Date().toLocaleString();
  • 值得注意的是,这些方法可以采用语言环境和选项以提供更大的灵活性。例如美国24小时制date.toLocaleTimeString('en-US', { hour12: false });developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

JavaScript Date 有几种方法可以让您提取其部分:

getFullYear() - 返回 4 位数年份
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 之间的分钟数。

没有内置方法可让您获取“Friday”、“February”或“PM”等本地化字符串。你必须自己编写代码。要得到你想要的字符串,你至少需要存储日期和月份的字符串表示形式:

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;
&lt;span id="time"&gt;&lt;/span&gt;

我有一个我喜欢包含在标准库中的日期格式函数。它采用定义所需输出的格式字符串参数。格式字符串松散地基于.Net custom Date and Time format strings。对于您指定的格式,可以使用以下格式字符串:"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;
};

【讨论】:

  • 非常感谢。虽然我的最终代码需要一些调整,但您的见解有所帮助。
  • 我如何格式化 date = "2016/03/01 11:00" to date="Sat Mar 01 2016 11:00:00 GMT+0530 (IST)"
  • MMMM[0] 如何返回正确的月份名称而不是索引 0 处的不可打印字符?不应该是MMMM[M]吗?我只是笨吗? (没关系。它将它设置为不可打印的字符,稍后会替换它以避免冲突)
【解决方案3】:

2017 年更新:使用 toLocaleDateStringtoLocaleTimeString 来格式化日期和时间。传递给这些方法的第一个参数是语言环境值,例如 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)); 

输出:2017 年 10 月 25 日,星期三,晚上 8:19

更多详情请参考以下链接。

Date and Time Strings (JavaScript)

【讨论】:

  • 此时 - 在第一次回答这个问题四年多之后 - 这是现在最方便和灵活的解决方案,并回答这个问题。作为当前(AD 2018)实践的一个例子,它应该被提升到更高的水平:-)
  • 撕裂。 @thdoan 的 strftime 端口看起来更灵活。例如,toLocalTimeString 提供 4 种日期样式,fulllongmediumshort,也许这些术语的含义在某处定义。同时, strftime 可以(可能)匹配其中任何一个以及更多。另一方面,toLocalTimeString 支持时区。我希望包括使用夏令时的时区...
  • 完美的答案,解决了整个问题。我认为缺少直接描述参数和选项的 toLocaleString() 链接
【解决方案4】:

你可以使用我的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;
  });
}

示例用法:

// 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/strftime

【讨论】:

  • 这太棒了。非常感谢。
【解决方案5】:

查看 Date 类的内部结构,您会发现可以提取所有位(日期、月份、年份、小时等)。

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 年 5 月 29 日修改,让 3 名反对者满意

【讨论】:

  • w3schools 不是很好。见w3fools。更好的参考来源包括MDNMSDN
  • Date#getDay 返回一个整数,而不是工作日的名称。此外,恕我直言,MDN 在快速理解 Date 对象方面做得更差,所以我不明白为什么需要贬低。
  • date.getMinutes() 的问题在于,当分钟数小于 10 时,它会返回一个数字,从而导致像“10:4 am”这样的时间,而不是更常见的“10:04 am” .
  • @JochemSchulenklopper 添加了非日期代码以在分钟上显示前导零
  • @Ninjaxor 添加了与日期无关的代码以将数字转换为字符串。如果您想要英文名称,这应该可以工作。
【解决方案6】:

对于那些感兴趣的人来说,那里有很多很棒的图书馆

现在真的不需要发明自己的格式说明符。

【讨论】:

  • 只是想提一下,截至 2017 年 10 月,moment 是 Javascript 中与时间相关的当前标准。
  • 感谢 @shawon191 的更新 :) 是的,moment 摇滚。 d3 也添加了一些时间的东西,所以如果你已经在使用它,你也许可以保存一个库导入 github.com/d3/d3/blob/master/API.md#time-formats-d3-time-format
【解决方案7】:

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

【讨论】:

    【解决方案8】:

    对于这种真正的 mysql 风格,请使用以下函数:2019/02/28 15:33:12

    • 如果您点击
    • 下方的“运行代码 sn-p”按钮
    • 它将向您展示一个简单的实时数字时钟示例 演示将出现在代码 sn-p 下方。

    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);
    &lt;div id="digital-clock"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案9】:

      使用Moment

      我不能推荐使用Moment。如果您能够使用第三方库,我强烈建议您这样做。除了格式化之外,它还可以非常好地处理时区、解析、持续时间和时间旅行,并将在简单性和时间上带来好处(以较小的大小、抽象和性能为代价)。

      用法

      你想要看起来像这样的东西:

      2013 年 2 月 1 日星期五下午 2:00

      嗯,有了 Moment,你需要做的就是:

      import Moment from "moment";
      
      Moment().format( "dddd h:mma D MMM YYYY" ); //=> "Wednesday 9:20am 9 Dec 2020"
      

      如果您想匹配确切的日期和时间,您需要做的就是:

      import Moment from "moment";
      
      Moment( "2013-2-1 14:00:00" ).format( "dddd h:mma D MMM YYYY" ) ); //=> "Friday 2:00pm 1 Feb 2013"
      

      here 中可以找到无数其他格式选项。

      安装

      转到他们的home page 以查看更详细的说明,但如果您使用的是 npm 或 yarn,则非常简单:

      npm install moment --save
      

      yarn add moment
      

      【讨论】:

        【解决方案10】:

        只有时间

        const getTime = ()=>{
            const d = new Date();
            const dd = [d.getHours(), d.getMinutes(), d.getSeconds()].map((a)=>(a < 10 ? '0' + a : a));
            return dd.join(':');
        };
        

        【讨论】:

          【解决方案11】:

          2.39KB 缩小。一份文件。 https://github.com/rhroyston/clock-js

          当前时间是

          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"
          

          【讨论】:

            【解决方案12】:
            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"
            

            【讨论】:

              【解决方案13】:

              要使用基本的 Date 类,您可以查看 MDN 的方法(而不是 W3Schools,因为 this reason)。在那里,您可以找到对访问每个日期/时间组件有用的每种方法的良好描述,以及与方法是否被弃用相关的信息。

              否则,您可以查看Moment.js,这是一个用于日期和时间处理的好库。您可以使用它来操作日期和时间(例如解析、格式化、i18n 等)。

              【讨论】:

                【解决方案14】:
                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

                【讨论】:

                • 您的回答绝不会回答 OP。
                • 什么是checkTime函数?
                【解决方案15】:

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

                【讨论】:

                • 运行代码报错:Uncaught TypeError: date.format is not a function
                猜你喜欢
                • 1970-01-01
                • 2011-12-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-11-24
                • 1970-01-01
                • 2014-04-29
                相关资源
                最近更新 更多