在 javascript/jquery 中是否有等效的 PHP date()?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8099681/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 02:16:33  来源:igfitidea点击:

Is there a PHP date() equivalent in javascript/jquery?

javascriptjquerydate

提问by Will

I'm attempting to calculate the day of the year (either with today or another date).

我正在尝试计算一年中的哪一天(今天或其他日期)。

In PHP I can use the date() function and do whatever I want...

在 PHP 中,我可以使用 date() 函数并做任何我想做的事情......

Is there something similar in JS/jQuery?

JS/jQuery 中是否有类似的东西?

回答by Scott Yang

Surprised nobody posted about moment.js, it's very similar to date.js, but lighter (5.5k minified)

很惊讶没有人发布关于 moment.js 的帖子,它与 date.js 非常相似,但更轻(5.5k 缩小)

http://momentjs.com/

http://momentjs.com/

Just did a benchmark and found it parses much faster than date.js, but formatting and manipulating is slower. For one-liners it'd execute faster than date.js due to the faster parsing.

刚刚做了一个基准测试,发现它的解析速度比 date.js 快得多,但格式化和操作更慢。对于单行程序,由于解析速度更快,它的执行速度会比 date.js 更快。

http://jsperf.com/underscore-date-vs-datejs/7

http://jsperf.com/underscore-date-vs-datejs/7

Some usage examples:

一些使用示例:

// Simulates ajax response
var data = { someDate: "2023-08-23 11:52:39" }

// .unix() converts to Unix timestamp: 1692816759
moment(data.someDate).unix();

// Displaying it in a readable format
// Aug 23, 11:52 AM
moment("2023-08-23 11:52:39").format('MMM D, hh:mm A');

// Now
moment();

// Support for manipulation and chaining
moment().add('days', 7).subtract('months', 1).hours(15).minutes(0).seconds(0);

回答by simshaun

I use Datejs.

我使用Datejs

回答by Chad von Nau

If you're coming from PHP, you might enjoy this port of strftime to JS.

如果您来自 PHP,您可能会喜欢 strftime 到 JS 的这个端口。

http://hacks.bluesmoon.info/strftime/demo.html

http://hacks.bluesmoon.info/strftime/demo.html

var dateObj = new Date('2011/11/11');
var dayOfYear = dateObj.strftime("%j");

I've used it a bunch and it's great. I believe it's significantly lighter weight than Datejs.

我已经用了一堆,它很棒。我相信它比 Datejs 轻得多。

回答by Andrew G. Johnson

I use the date_to_string() function

我使用date_to_string() 函数

/*
 * date_to_string v1.0.0
 *
 * Copyright (c) 2013 Andrew G. Johnson <[email protected]>
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * @author Andrew G. Johnson <[email protected]>
 * @copyright Copyright (c) 2013 Andrew G. Johnson <[email protected]>
 * @link http://github.com/andrewgjohnson/date_to_string
 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
 * @version 1.0.0
 * @package date_to_string
 *
 */

if (typeof date_to_string == "undefined")
{
    var date_to_string = function(format,date) {
        format = String(format);
        date = typeof date != "undefined" && date instanceof Date ? date : new Date();

        var formats = {
            a:function(date) {
                return date.getHours() < 12 ? "am" : "pm";
            },
            A:function(date) {
                return date.getHours() < 12 ? "AM" : "PM";
            },
            B:function(date) {
                return ("000" + Math.floor((date.getHours() * 60 * 60 + (date.getMinutes() + 60 + date.getTimezoneOffset()) * 60 + date.getSeconds()) / 86.4) % 1000).slice(-3);
            },
            c:function(date) {
                return date_to_string("Y-m-d\TH:i:s",date);
            },
            d:function(date) {
                return (date.getDate() < 10 ? "0" : "") + date.getDate();
            },
            D:function(date) {
                switch (date.getDay())
                {
                    case 0:
                        return "Sun";

                    case 1:
                        return "Mon";

                    case 2:
                        return "Tue";

                    case 3:
                        return "Wed";

                    case 4:
                        return "Thu";

                    case 5:
                        return "Fri";

                    case 6:
                        return "Sat";
                }
            },
            e:function(date) {
                var
                    first = parseInt(Math.abs(date.getTimezoneOffset() / 60),10),
                    second = Math.abs(date.getTimezoneOffset() % 60);
                return (new Date().getTimezoneOffset() < 0 ? "+" : "-") + (first < 10 ? "0" : "") + first + (second < 10 ? "0" : "") + second;
            },
            F:function(date) {
                switch (date.getMonth())
                {
                    case 0:
                        return "January";

                    case 1:
                        return "February";

                    case 2:
                        return "March";

                    case 3:
                        return "April";

                    case 4:
                        return "May";

                    case 5:
                        return "June";

                    case 6:
                        return "July";

                    case 7:
                        return "August";

                    case 8:
                        return "September";

                    case 9:
                        return "October";

                    case 10:
                        return "November";

                    case 11:
                        return "December";
                }
            },
            g:function(date) {
                return date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
            },
            G:function(date) {
                return date.getHours();
            },
            h:function(date) {
                var hour = date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
                return (hour < 10 ? "0" : "") + hour;
            },
            H:function(date) {
                return (date.getHours() < 10 ? "0" : "") + date.getHours();
            },
            i:function(date) {
                return (date.getMinutes() < 10 ? "0" : "") + date.getMinutes();
            },
            I:function(date) {
                return date.getTimezoneOffset() < Math.max(new Date(date.getFullYear(),0,1).getTimezoneOffset(),new Date(date.getFullYear(),6,1).getTimezoneOffset()) ? 1 : 0;
            },
            j:function(date) {
                return date.getDate();
            },
            l:function(date) {
                switch (date.getDay())
                {
                    case 0:
                        return "Sunday";

                    case 1:
                        return "Monday";

                    case 2:
                        return "Tuesday";

                    case 3:
                        return "Wednesday";

                    case 4:
                        return "Thursday";

                    case 5:
                        return "Friday";

                    case 6:
                        return "Saturday";
                }
            },
            L:function(date) {
                return new Date(date.getFullYear(),1,29).getMonth() == 1 ? 1 : 0;
            },
            m:function(date) {
                return (date.getMonth() + 1 < 10 ? "0" : "") + (date.getMonth() + 1);
            },
            M:function(date) {
                switch (date.getMonth())
                {
                    case 0:
                        return "Jan";

                    case 1:
                        return "Feb";

                    case 2:
                        return "Mar";

                    case 3:
                        return "Apr";

                    case 4:
                        return "May";

                    case 5:
                        return "Jun";

                    case 6:
                        return "Jul";

                    case 7:
                        return "Aug";

                    case 8:
                        return "Sep";

                    case 9:
                        return "Oct";

                    case 10:
                        return "Nov";

                    case 11:
                        return "Dec";
                }
            },
            n:function(date) {
                return date.getMonth() + 1;
            },
            N:function(date) {
                return date.getDay() == 0 ? 7 : date.getDay();
            },
            o:function(date) {
                return date.getWeekYear();
            },
            O:function(date) {
                var
                    first = parseInt(Math.abs(date.getTimezoneOffset() / 60),10),
                    second = Math.abs(date.getTimezoneOffset() % 60);
                return (new Date().getTimezoneOffset() < 0 ? "+" : "-") + (first < 10 ? "0" : "") + first + (second < 10 ? "0" : "") + second;
            },
            P:function(date) {
                var
                    first = parseInt(Math.abs(date.getTimezoneOffset() / 60),10),
                    second = Math.abs(date.getTimezoneOffset() % 60);
                return (new Date().getTimezoneOffset() < 0 ? "+" : "-") + (first < 10 ? "0" : "") + first + ":" + (second < 10 ? "0" : "") + second;
            },
            r:function(date) {
                return date_to_string("D, d M Y H:i:s O",date);
            },
            s:function(date) {
                return (date.getSeconds() < 10 ? "0" : "") + date.getSeconds();
            },
            S:function(date) {
                switch (date.getDate())
                {
                    case 1:
                    case 21:
                    case 31:
                        return "st";

                    case 2:
                    case 22:
                        return "nd";

                    case 3:
                    case 23:
                        return "rd";

                    default:
                        return "th";
                }
            },
            t:function(date) {
                return new Date(date.getFullYear(),date.getMonth() + 1,0).getDate();
            },
            T:function(date) {
                var abbreviation = String(date).match(/\(([^\)]+)\)$/) || String(date).match(/([A-Z]+) [\d]{4}$/);
                if (abbreviation)
                    abbreviation = abbreviation[1].match(/[A-Z]/g).join("");
                return abbreviation;
            },
            u:function(date) {
                return date.getMilliseconds() * 1000;
            },
            U:function(date) {
                return Math.round(date.getTime() / 1000);
            },
            w:function(date) {
                return date.getDay();
            },
            W:function(date) {
                return date.getWeek();
            },
            y:function(date) {
                return String(date.getFullYear()).substring(2,4);
            },
            Y:function(date) {
                return date.getFullYear();
            },
            z:function(date) {
                return Math.floor((date.getTime() - new Date(date.getFullYear(),0,1).getTime()) / (1000 * 60 * 60 * 24));
            },
            Z:function(date) {
                return (date.getTimezoneOffset() < 0 ? "+" : "-") + (date.getTimezoneOffset() * 24);
            }
        };

        var
            string = "",
            escaped = false;
        for (var position = 0;position < format.length;position++)
        {
            if (!escaped && format.substring(position,position + 1) == "\")
                escaped = true;
            else if (escaped || typeof formats[format.substring(position,position + 1)] == "undefined")
            {
                string += String(format.substring(position,position + 1));
                escaped = false;
            }
            else
                string += String(formats[format.substring(position,position + 1)](date));
        }
        return string;
    };
}

// http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
Date.prototype.getWeek = function() {
    var target = new Date(this.valueOf());
    var dayNr = (this.getDay() + 6) % 7;
    target.setDate(target.getDate() - dayNr + 3);
    var firstThursday = target.valueOf();
    target.setMonth(0,1);
    if (target.getDay() != 4) {
        target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
    }
    return 1 + Math.ceil((firstThursday - target) / (1000 * 60 * 60 * 24 * 7));
};
Date.prototype.getWeekYear = function() {
    var target  = new Date(this.valueOf());
    target.setDate(target.getDate() - ((this.getDay() + 6) % 7) + 3);
    return target.getFullYear();
};

回答by Mike

According to the authors, phpjs date()is "a JavaScript equivalent of PHP's date". So if that's what you're looking for, give it a try.

根据作者的说法,phpjs date()是“相当于 PHP 日期的 JavaScript”。因此,如果这就是您正在寻找的内容,请尝试一下。

Edit

编辑

In case the remote site goes down, here's the code (retrieved 2016-02-03):

如果远程站点出现故障,这里是代码(检索 2016-02-03):

function date(format, timestamp) {
  //  discuss at: http://phpjs.org/functions/date/
  // original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
  // original by: gettimeofday
  //    parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: MeEtc (http://yass.meetcweb.com)
  // improved by: Brad Touesnard
  // improved by: Tim Wiel
  // improved by: Bryan Elliott
  // improved by: David Randall
  // improved by: Theriault
  // improved by: Theriault
  // improved by: Brett Zamir (http://brett-zamir.me)
  // improved by: Theriault
  // improved by: Thomas Beaucourt (http://www.webapp.fr)
  // improved by: JT
  // improved by: Theriault
  // improved by: Rafa? Kukawski (http://blog.kukawski.pl)
  // improved by: Theriault
  //    input by: Brett Zamir (http://brett-zamir.me)
  //    input by: majak
  //    input by: Alex
  //    input by: Martin
  //    input by: Alex Wilson
  //    input by: Haravikk
  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: majak
  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: Brett Zamir (http://brett-zamir.me)
  // bugfixed by: omid (http://phpjs.org/functions/380:380#comment_137122)
  // bugfixed by: Chris (http://www.devotis.nl/)
  //        note: Uses global: php_js to store the default timezone
  //        note: Although the function potentially allows timezone info (see notes), it currently does not set
  //        note: per a timezone specified by date_default_timezone_set(). Implementers might use
  //        note: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function
  //        note: in order to adjust the dates in this function (or our other date functions!) accordingly
  //   example 1: date('H:m:s \m \i\s \m\o\n\t\h', 1062402400);
  //   returns 1: '09:09:40 m is month'
  //   example 2: date('F j, Y, g:i a', 1062462400);
  //   returns 2: 'September 2, 2003, 2:26 am'
  //   example 3: date('Y W o', 1062462400);
  //   returns 3: '2003 36 2003'
  //   example 4: x = date('Y m d', (new Date()).getTime()/1000);
  //   example 4: (x+'').length == 10 // 2009 01 09
  //   returns 4: true
  //   example 5: date('W', 1104534000);
  //   returns 5: '53'
  //   example 6: date('B t', 1104534000);
  //   returns 6: '999 31'
  //   example 7: date('W U', 1293750000.82); // 2010-12-31
  //   returns 7: '52 1293750000'
  //   example 8: date('W', 1293836400); // 2011-01-01
  //   returns 8: '52'
  //   example 9: date('W Y-m-d', 1293974054); // 2011-01-02
  //   returns 9: '52 2011-01-02'

  var that = this;
  var jsdate, f;
  // Keep this here (works, but for code commented-out below for file size reasons)
  // var tal= [];
  var txt_words = [
    'Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur',
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
  ];
  // trailing backslash -> (dropped)
  // a backslash followed by any character (including backslash) -> the character
  // empty string -> empty string
  var formatChr = /\?(.?)/gi;
  var formatChrCb = function(t, s) {
    return f[t] ? f[t]() : s;
  };
  var _pad = function(n, c) {
    n = String(n);
    while (n.length < c) {
      n = '0' + n;
    }
    return n;
  };
  f = {
    // Day
    d: function() { // Day of month w/leading 0; 01..31
      return _pad(f.j(), 2);
    },
    D: function() { // Shorthand day name; Mon...Sun
      return f.l()
        .slice(0, 3);
    },
    j: function() { // Day of month; 1..31
      return jsdate.getDate();
    },
    l: function() { // Full day name; Monday...Sunday
      return txt_words[f.w()] + 'day';
    },
    N: function() { // ISO-8601 day of week; 1[Mon]..7[Sun]
      return f.w() || 7;
    },
    S: function() { // Ordinal suffix for day of month; st, nd, rd, th
      var j = f.j();
      var i = j % 10;
      if (i <= 3 && parseInt((j % 100) / 10, 10) == 1) {
        i = 0;
      }
      return ['st', 'nd', 'rd'][i - 1] || 'th';
    },
    w: function() { // Day of week; 0[Sun]..6[Sat]
      return jsdate.getDay();
    },
    z: function() { // Day of year; 0..365
      var a = new Date(f.Y(), f.n() - 1, f.j());
      var b = new Date(f.Y(), 0, 1);
      return Math.round((a - b) / 864e5);
    },

    // Week
    W: function() { // ISO-8601 week number
      var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3);
      var b = new Date(a.getFullYear(), 0, 4);
      return _pad(1 + Math.round((a - b) / 864e5 / 7), 2);
    },

    // Month
    F: function() { // Full month name; January...December
      return txt_words[6 + f.n()];
    },
    m: function() { // Month w/leading 0; 01...12
      return _pad(f.n(), 2);
    },
    M: function() { // Shorthand month name; Jan...Dec
      return f.F()
        .slice(0, 3);
    },
    n: function() { // Month; 1...12
      return jsdate.getMonth() + 1;
    },
    t: function() { // Days in month; 28...31
      return (new Date(f.Y(), f.n(), 0))
        .getDate();
    },

    // Year
    L: function() { // Is leap year?; 0 or 1
      var j = f.Y();
      return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0;
    },
    o: function() { // ISO-8601 year
      var n = f.n();
      var W = f.W();
      var Y = f.Y();
      return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
    },
    Y: function() { // Full year; e.g. 1980...2010
      return jsdate.getFullYear();
    },
    y: function() { // Last two digits of year; 00...99
      return f.Y()
        .toString()
        .slice(-2);
    },

    // Time
    a: function() { // am or pm
      return jsdate.getHours() > 11 ? 'pm' : 'am';
    },
    A: function() { // AM or PM
      return f.a()
        .toUpperCase();
    },
    B: function() { // Swatch Internet time; 000..999
      var H = jsdate.getUTCHours() * 36e2;
      // Hours
      var i = jsdate.getUTCMinutes() * 60;
      // Minutes
      var s = jsdate.getUTCSeconds(); // Seconds
      return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
    },
    g: function() { // 12-Hours; 1..12
      return f.G() % 12 || 12;
    },
    G: function() { // 24-Hours; 0..23
      return jsdate.getHours();
    },
    h: function() { // 12-Hours w/leading 0; 01..12
      return _pad(f.g(), 2);
    },
    H: function() { // 24-Hours w/leading 0; 00..23
      return _pad(f.G(), 2);
    },
    i: function() { // Minutes w/leading 0; 00..59
      return _pad(jsdate.getMinutes(), 2);
    },
    s: function() { // Seconds w/leading 0; 00..59
      return _pad(jsdate.getSeconds(), 2);
    },
    u: function() { // Microseconds; 000000-999000
      return _pad(jsdate.getMilliseconds() * 1000, 6);
    },

    // Timezone
    e: function() { // Timezone identifier; e.g. Atlantic/Azores, ...
      // The following works, but requires inclusion of the very large
      // timezone_abbreviations_list() function.
      /*              return that.date_default_timezone_get();
       */
      throw 'Not supported (see source code of date() for timezone on how to add support)';
    },
    I: function() { // DST observed?; 0 or 1
      // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
      // If they are not equal, then DST is observed.
      var a = new Date(f.Y(), 0);
      // Jan 1
      var c = Date.UTC(f.Y(), 0);
      // Jan 1 UTC
      var b = new Date(f.Y(), 6);
      // Jul 1
      var d = Date.UTC(f.Y(), 6); // Jul 1 UTC
      return ((a - c) !== (b - d)) ? 1 : 0;
    },
    O: function() { // Difference to GMT in hour format; e.g. +0200
      var tzo = jsdate.getTimezoneOffset();
      var a = Math.abs(tzo);
      return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4);
    },
    P: function() { // Difference to GMT w/colon; e.g. +02:00
      var O = f.O();
      return (O.substr(0, 3) + ':' + O.substr(3, 2));
    },
    T: function() { // Timezone abbreviation; e.g. EST, MDT, ...
      // The following works, but requires inclusion of the very
      // large timezone_abbreviations_list() function.
      /*              var abbr, i, os, _default;
      if (!tal.length) {
        tal = that.timezone_abbreviations_list();
      }
      if (that.php_js && that.php_js.default_timezone) {
        _default = that.php_js.default_timezone;
        for (abbr in tal) {
          for (i = 0; i < tal[abbr].length; i++) {
            if (tal[abbr][i].timezone_id === _default) {
              return abbr.toUpperCase();
            }
          }
        }
      }
      for (abbr in tal) {
        for (i = 0; i < tal[abbr].length; i++) {
          os = -jsdate.getTimezoneOffset() * 60;
          if (tal[abbr][i].offset === os) {
            return abbr.toUpperCase();
          }
        }
      }
      */
      return 'UTC';
    },
    Z: function() { // Timezone offset in seconds (-43200...50400)
      return -jsdate.getTimezoneOffset() * 60;
    },

    // Full Date/Time
    c: function() { // ISO-8601 date.
      return 'Y-m-d\TH:i:sP'.replace(formatChr, formatChrCb);
    },
    r: function() { // RFC 2822
      return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
    },
    U: function() { // Seconds since UNIX epoch
      return jsdate / 1000 | 0;
    }
  };
  this.date = function(format, timestamp) {
    that = this;
    jsdate = (timestamp === undefined ? new Date() : // Not provided
      (timestamp instanceof Date) ? new Date(timestamp) : // JS Date()
      new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
    );
    return format.replace(formatChr, formatChrCb);
  };
  return this.date(format, timestamp);
}

Note: Php.js is licensed under MIT license. See http://phpjs.org/about/for more details.

注意:Php.js 在 MIT 许可下获得许可。有关更多详细信息,请参阅http://phpjs.org/about/

回答by Andras

if you don't need full timezone support (North American timezones only), I wrote a very fast, fully compatible phpdate()and matching gmdate()that exactly emulate the php dateand gmdatefunctions. (The unit tests have a fuzz test that format random timestamps and compare against php; I've run several hundred thousand timestamps while testing.) I wrote it for nodejs, but if someone helps, I'd be willing to port it to pure js.

如果您不需要完整的时区支持(仅限北美时区),我编写了一个非常快速、完全兼容phpdate()和匹配的gmdate()完全模拟 phpdategmdate函数的程序。(单元测试有一个模糊测试,格式化随机时间戳并与 php 进行比较;我在测试时运行了几十万个时间戳。)我为 nodejs 编写了它,但如果有人帮助,我愿意将它移植到纯js。

All the conversion specifiers are supported; no external dependencies.

支持所有转换说明符;没有外部依赖。

ISO week and year numbering, day-of-week and leap-year info is extracted from Date(). Timezone information is reverse engineered from the UTC offset made available by Date().

ISO 周和年编号、星期几和闰年信息从 Date() 中提取。时区信息是从 Date() 提供的 UTC 偏移量逆向工程的。