JavaScript/jQuery有类似于PHP date()的函数吗?

13

我想要计算一年中的第几天(可以使用今天日期或其他日期)。

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

在 JS/jQuery 中是否有类似的函数?


1
请查看Datejs - gen_Eric
6个回答

20

惊讶地发现还没有人提到moment.js,它与date.js非常相似,但更加轻便(5.5k压缩后大小)

http://momentjs.com/

我进行了基准测试,并发现它的解析速度比date.js要快得多,但是格式化和操作速度较慢。对于一行代码,由于解析更快,它将比date.js执行得更快。

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

一些使用示例:

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

我们实际上已经开始广泛使用它了。太棒了 :)。 - Will

5

哇!太棒了!我从来没有听说过...真是个不错的发现。 - Yevgeny Simkin
尽管这是一个非常老的答案,但请考虑OP要求JS中类似于PHP的date函数的等效函数。由于没有内置函数,因此链接到库是合理的。可以肯定的是,答案可以通过代码示例进行改进,但在这种情况下,“关键部分”实际上是链接。 - simshaun

3
根据作者的说法,phpjs date()是“PHP的日期函数在JavaScript中的等效替代品”。所以如果您需要此功能,请尝试使用它。 编辑 如果远程网站无法访问,这里是代码(检索于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);
}

注意:Php.js采用MIT许可证。有关更多详细信息,请参见http://phpjs.org/about/

2
我使用 date_to_string() 函数
/*
 * date_to_string v1.0.0
 *
 * Copyright (c) 2013 Andrew G. Johnson <andrew@andrewgjohnson.com>
 * 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 <andrew@andrewgjohnson.com>
 * @copyright Copyright (c) 2013 Andrew G. Johnson <andrew@andrewgjohnson.com>
 * @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();
};

正是我所需要的:一个简单的函数添加就能完成任务。谢谢! - Muhammad Abdul-Rahim
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - Andrew Brooke
1
@AndrewBrooke这是尝试回答问题的方式,即使链接标记被删除。这个答案不应该被标记,因此在LQPRQ中不应该被推荐删除。请参阅:你做错了:关于低质量帖子队列的理智呼吁你的回答在另一个城堡里:何时回答不是回答? - user4639281
@TinyGiant 再次查看,我认为你是对的。不过,答案是否至少提供此函数用法的示例会更好呢? - Andrew Brooke
@AndrewBrooke 当然会更好。如果作者能够包含详细的解释,那就太好了,但是当您审查它时,它不应该被推荐删除,因为它本来就不应该被标记。请记住,在LQPRQ中,您正在投票是否应该标记答案,而不是您认为它应该被删除与否。标记系统和LQPRQ不能替代删除投票。有一个原因,你必须等到20k才能投票删除答案。 - user4639281

2
如果你来自PHP,你可能会喜欢这个将strftime移植到JS的端口。

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

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

我用过它很多次,非常好用。我相信它比Datejs轻很多。

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接