如何检查夏令时是否生效,如果是的话,偏移量是多少?

219

这是我的一段JS代码,需要使用它:

var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);

我想获得"ago"时间格式的日期时间,但如果正在使用夏令时(DST),则日期会偏移1小时。 我不知道如何检查是否正在使用夏令时。

我如何知道何时开始和结束夏令时?


zoned-date 是一个具有时区和夏令时支持的日期库。 - undefined
16个回答

395

这段代码利用了 getTimezoneOffset 在标准时间和夏令时中返回一个 更大的值 的事实。因此,它确定了在标准时间下的预期输出,并比较给定日期的输出是否相同(标准时间)或更少(夏令时)。

请注意,getTimezoneOffset 对于协调世界时(UTC)西边的时区返回 正数 分钟数,通常被表示为负小时数(因为它们 "落后" 于 UTC)。例如,洛杉矶是 UTC-8h 标准时间,UTC-7h 夏令时。在冬季(标准时间)的12月份,getTimezoneOffset 返回 480(正480分钟),而不是 -480。对于东半球(如悉尼),它返回 负数,例如在冬季返回 -600,尽管这实际上是 "领先" 的(UTC+10h)。

Date.prototype.stdTimezoneOffset = function () {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.isDstObserved = function () {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

var today = new Date();
if (today.isDstObserved()) { 
    alert ("Daylight saving time!");
}

35
我可以证实这适用于国际环境。目前没有任何一个使用夏令时的时区,其中1月1日和7月1日都处于夏令时期间或不处于夏令时期间。此外,在TZDB中的所有时区(有一个微不足道的例外),两个偏移量中较大的是夏令时偏移量。由于JavaScript的getTimezoneOffset返回反向值,因此Math.max确实返回标准偏移量。代码是正确的。 - Matt Johnson-Pint
9
然而,如果任何一个时区改变了定义,使得1月1日和7月1日都处于夏令时,或者两者都不处于夏令时(而仍然适用夏令时),那么这段代码在该时区将无法正常工作。 - Matt Johnson-Pint
11
一般而言这并不可行,例如某些国家在特定年份没有遵守夏令时,还有一些国家在斋月期间会撤销夏令时。此外,对于 Date 的 ECMAScript 定义存在问题,有些实现中处理 TZ 环境变量也存在问题。所有这些问题的结合使得这种方法不可靠。最好使用一个不使用 Date 的库,比如 timezonecomplete。 - rogierschouten
5
这段代码在不执行夏令时的国家无法正常运行,例如南非或冰岛;这意味着如果您将其用于与这些国家的其他时区进行比较,则不会显示正确的时间。建议始终使用协调世界时(UTC),并手动检查当前时间是否在某个夏令时范围内。然后只需将普通时间的UTC偏移量增加1小时即可获取夏令时。 - Kebman
7
对于使用AWS Lambda或Node以UTC作为本地时区的用户,此方法无效。getTimezoneOffset()在一月和七月份都会返回0。 - Connor
显示剩余13条评论

59

这个答案与被采纳的答案非常相似,但它不会覆盖Date原型,并且仅使用一个函数调用来检查夏令时是否生效,而不是两个。


思路是,在没有国家观察持续七个月的夏令时[1]的情况下,在观察夏令时的地区,一月份与七月份的UTC时间偏移将不同。

虽然夏令时将时钟向前调整,但JavaScript始终在标准时间返回较大的值。因此,获取一月和七月之间的最小偏移量将得到夏令时的时区偏移。

然后我们检查日期的时区是否等于该最小值。如果是,则表示我们处于夏令时;否则,表示我们不处于夏令时。

以下函数使用此算法。它接受一个日期对象d,如果该日期处于夏令时,则返回true,否则返回false

function isDST(d) {
    let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
    let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
    return Math.max(jan, jul) !== d.getTimezoneOffset();    
}

9
这个方法是可行的,但如果当前时区没有夏令时,则结果也会为true,这是不正确的。如果你将它改为 Math.max(...) != d.get...() ,那么只有在给定的时区中观察到夏令时并且当前日期处于夏令时时才会返回true。如果没有观察到夏令时或者该日期匹配标准偏移量,则返回false。 - GreySage
3
看起来回答已经进行了编辑,以适应上面评论中提到的修复措施。@Toastrackenigma,您可以确认并添加一条注释说明这种情况吗? - 3dGrabber
4
是的,@GreySage指出了一个很棒的地方,我很快在他们评论后就编辑了回答并加以融合。 - Toastrackenigma
目前这个功能无法检测特定时区是否启用了夏令时(只能检测客户端计算机所在的时区)。我希望能够扩展此功能,包括指定时区。 - jbyrd

29

创建两个日期:一个在6月,另一个在1月。比较它们的 getTimezoneOffset()值。

  • 如果1月的偏移量 > 6月的偏移量,则客户端位于北半球
  • 如果1月的偏移量 < 6月的偏移量,则客户端位于南半球
  • 如果没有差异,则客户端时区不遵循夏令时

现在检查当前日期的 getTimezoneOffset()

  • 如果等于6月,表示在北半球,那么当前时区是夏令时(+1小时)
  • 如果等于1月,表示在南半球,那么当前时区是夏令时(+1小时)

1
为什么需要半球?如果getTimezoneOffset()对于当前日期等于两个getTimezoneOffset()中较小的一个,那么这不足以说明它是夏令时吗?[并且偏移量是两者之间的差异?] - epeleg
你不需要半球,因为被接受的答案已经清楚地证明了这一点 :) - Jon Nylander
1
这样做行不通。最好的方法是确保使用UTC时间并手动设置所需区域的偏移量。然后手动查找同一区域的夏令时开始和结束时间(如果有)。接下来,您需要检查该区域的时间是否在夏令时范围内,然后相应地更新偏移量为+1。这使得可以比较观察夏令时和不观察夏令时的国家。 - Kebman
1
问题是如何确定客户机Kebman所在时区当前是否实行夏令时,而不是如何显示日期,Web客户端已经为您处理了这个问题。 - Jon Nylander
你应该检查一月到七月之间(或二月到八月、三月到九月等),因为它们相隔六个月。 - kpull1

14

今天我也遇到了同样的问题,但由于我们的夏令时开始和结束的时间与美国不同(至少我是这样理解的),所以我使用了稍微不同的方法。

var arr = [];
for (var i = 0; i < 365; i++) {
 var d = new Date();
 d.setDate(i);
 newoffset = d.getTimezoneOffset();
 arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);

然后,您只需将当前时区偏移与DST和非DST进行比较,以查看哪个匹配。


这也是我们的做法。也就是说,找出目标时区每年DST更改的时间,并计算当前日期和最近更改日期的偏移量。它们将相差一个小时或相等(假设所涉及的时区为一小时偏移)。 - Heather
没有必要创建365个值,二进制搜索方法一旦确定偏移量发生变化就停止,应该会更加高效,即使不观察夏令时。所有这些方法都假设地点每年都遵循夏令时,但这并不一定正确。地方时而采纳和放弃夏令时(尽管ECMAScript假定当前规则始终适用于它们所在的地区)。 - RobG
3
如果你不知道要搜索的位置(即你正在查找的位置是在测试点的上方还是下方),那么如何使用二分查找进行操作呢,Rob? - epeleg

11
在 JavaScript 中,getTimezoneOffset() 方法返回浏览器当前时区与 UTC 时间相差的分钟数。例如,美国/纽约夏令时(DST)时区返回数字 300。300 分钟是距零点五小时的时间差。每个时区都与零时区 +00:00 / Etc/GMT / 格林威治时间进行比较。

MDN Web Docs

另外需要了解的是,偏移量与实际时区的符号相反。
有关时区的信息由互联网数字分配机构(iana)维护。

iana time zones

joda.org 提供了一个格式良好的时区表。

joda-time Time Zones

+00:00 或 Etc/GMT 是格林威治时间。

所有时区都偏移自+00:00 / "Etc/GMT" / 格林威治时间

夏令时总是比夏季的“常规”时间早。在秋季,您需要将时钟拨回。 (“Fall Back”口号可以帮助您记住该怎么做)

因此,美国/纽约夏令时(冬季)比常规时间早一小时。例如,在夏季,纽约市下午5点通常是下午5点,而现在在夏令时中是下午4点。 “美国/纽约”时间是“长格式”时区名称。美国东海岸通常称其时区为东部标准时间(EST)

如果您想比较今天的时区偏移与其他日期的时区偏移,请注意时区偏移的数学符号(+/-“正/负”)与时区相反。

查看joda.org上的时区表,并找到“美国/纽约”的时区。它将在标准偏移量前面有一个负号。

地球沿着它的轴线逆时针旋转。在格林威治观日出的人会比纽约观日出的人提前5个小时看到日出。而美国西海岸的人将会在美国东海岸的人看到日出之后才看到日出。

你需要知道这一切的原因是为了让你能够逻辑地确定某些 JavaScript 代码是否正确地获取DST状态,而不需要在不同时间测试每个时区。

想象一下,现在是11月份在纽约市,时钟已经拨回了1个小时。在纽约市的夏季,偏移量为240分钟或4个小时。

您可以通过创建一个日期并获取偏移量来进行测试。

var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();

console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

在浏览器的开发者工具控制台日志中会打印什么?

答案是:240

现在,您可以创建一个1月份的日期,并查看您的浏览器在冬季时区偏移方面返回的内容。

var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

答案是:300

显然,300比240大。那么这意味着什么?你应该编写测试冬令时偏移量是否大于夏令时偏移量的代码吗?还是夏令时偏移量小于冬令时偏移量的代码?如���夏令时和冬令时的时区偏移有差异,则可以假定该时区使用DST。但这并不能告诉你今天浏览器时区是否使用DST。因此,您需要获取今天的时区偏移量。

var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();

console.log('todaysTimeZone : ' + todaysTimeZone)

答案是:?- 取决于一年中的时间

如果今天的时区偏移量和夏令时的时区偏移量相同,并且夏季和冬季的时区偏移量不同,则根据逻辑推断,今天必须不在使用夏令时。

您能否省略比较夏季和冬季的时区偏移量(以了解该时区是否使用夏令时),并仅将今天的时区偏移量与夏季时区偏移量进行比较,并始终获得正确答案?

today's TZ Offset !== Summer TZ Offset

那么,今天是冬天还是夏天呢?如果你知道了,就可以应用以下逻辑:

if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

但问题是,你不知道今天的日期是在冬季还是夏季。每个时区都可能有自己的夏令时开始和结束规则。你需要跟踪世界上每个时区的规则。因此,如果有更好、更简单的方法,那么最好采用更好、更简单的方法。

我们所剩下的就是需要知道这个时区是否使用夏令时,然后将今天的时区偏移量与夏令时的时区偏移量进行比较。这将始终给出可靠的答案。

最终的逻辑是:

if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

用于确定浏览器中的时区是否使用夏令时的函数:

function is_DST_Used_In_This_TimeZone() {
  var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet 
      offsetsNotEqual, thisYear, today;

  today = new Date();//Create a date object that is now
  thisYear = today.getFullYear();//Get the year as a number

  Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
  jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

  console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

  July_Date = new Date(thisYear, 6, 1);
  july_Timezone_OffSet = July_Date.getTimezoneOffset();

  console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

  offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal

  console.log('offsetsNotEqual: ' + offsetsNotEqual);

  return offsetsNotEqual;//If the offsets are not equal for summer and
       //winter then the only possible reason is that DST is used for
       //this time zone
}

2
根据dateandtime.com,DST在2019年3月10日开始,因此是夏季而不是冬季,纽约的DST偏移量为-4,而不是-5。 - jk7
如果需要对答案进行改进或修复,请进行编辑,然后将其进行审核。 - Alan Wells
在北半球,标准时间是冬季的时间。在瑞典,我们的标准时间是GMT+1,但在夏季月份,我们调整为GMT+2。我想要表达的是,标准时间并不是夏季的+1小时,那是夏令时的偏移时间。 - undefined

9

根据Matt Johanson对Sheldon Griffin提供的解决方案的评论,我创建了以下代码:

    Date.prototype.stdTimezoneOffset = function() {
        var fy=this.getFullYear();
        if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {

            var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
            var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];

            for(var mi=0;mi<12;mi++) {
                var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
                if (offset!=maxOffset) { 
                    maxOffset=Math.max(maxOffset,offset);
                    break;
                }
            }
            Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
        }
        return Date.prototype.stdTimezoneOffset.cache[fy];
    };

    Date.prototype.stdTimezoneOffset.cache={};

    Date.prototype.isDST = function() {
        return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
    };

它试图在考虑所有评论和先前建议的答案的基础上获得最佳结果,具体来说它:
1)对于每年的stdTimezoneOffset缓存结果,这样当测试同一年份的多个日期时就不需要重新计算它。
2)它不假设夏令时(如果有的话)一定在七月,而且即使某个地方的夏令时在某个月,它也可以工作。但是从性能上讲,如果真的在七月(或附近月份)存在夏令时,它会更快。
3)最坏的情况下,它将比较每个月的第一天的getTimezoneOffset。[并在测试年份时执行一次]
它所做的假设仍然是存在夏令时期大于单个月的情况。如果有人想要删除该假设,他可以将循环更改为类似于Aaron Cole提供的解决方案中的内容-但我仍然会向前跳半年,并在找到两个不同的偏移量时跳出循环。

8

适用于所有时区的未来解决方案

  1. x 为不考虑夏令时的年份中预期的毫秒数。
  2. y 为自纪元开始到感兴趣日期所在年份开始的毫秒数。
  3. z 为感兴趣日期和时间自纪元开始的毫秒数。
  4. tz - y - x 的差值,即从 z 中减去 xy,得到由夏令时引起的偏移量。
  5. 如果 t 为零,则夏令时未生效。如果 t 不为零,则夏令时生效。

"use strict";
function dstOffsetAtDate(dateInput) {
    var fullYear = dateInput.getFullYear()|0;
    // "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
    //   except if it can be exactly divided by 100, then it isn't (2100,2200,etc)
    //    except if it can be exactly divided by 400, then it is (2000, 2400)"
    // (https://www.mathsisfun.com/leap-years.html).
    var isLeapYear = ((fullYear & 3) | (fullYear/100 & 3)) === 0 ? 1 : 0;
    // (fullYear & 3) = (fullYear % 4), but faster
    //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
    var fullMonth = dateInput.getMonth()|0;
    return (
        // 1. We know what the time since the Epoch really is
        (+dateInput) // same as the dateInput.getTime() method
        // 2. We know what the time since the Epoch at the start of the year is
        - (+new Date(fullYear, 0)) // day defaults to 1 if not explicitly zeroed
        // 3. Now, subtract what we would expect the time to be if daylight savings
        //      did not exist. This yields the time-offset due to daylight savings.
        - ((
            ((
                // Calculate the day of the year in the Gregorian calendar
                // The code below works based upon the facts of signed right shifts
                //    • (x) >> n: shifts n and fills in the n highest bits with 0s 
                //    • (-x) >> n: shifts n and fills in the n highest bits with 1s
                // (This assumes that x is a positive integer)
                -1 + // first day in the year is day 1
                (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
                ((28 + isLeapYear) & ((1-fullMonth) >> 4)) + // February
                (31 & ((2-fullMonth) >> 4)) + // March
                (30 & ((3-fullMonth) >> 4)) + // April
                (31 & ((4-fullMonth) >> 4)) + // May
                (30 & ((5-fullMonth) >> 4)) + // June
                (31 & ((6-fullMonth) >> 4)) + // July
                (31 & ((7-fullMonth) >> 4)) + // August
                (30 & ((8-fullMonth) >> 4)) + // September
                (31 & ((9-fullMonth) >> 4)) + // October
                (30 & ((10-fullMonth) >> 4)) + // November
                // There are no months past December: the year rolls into the next.
                // Thus, fullMonth is 0-based, so it will never be 12 in Javascript
                
                (dateInput.getDate()|0) // get day of the month
                
            )&0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour
            + (dateInput.getHours()&0xff) * 60 // 60 minutes in an hour
            + (dateInput.getMinutes()&0xff)
        )|0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second
        - (dateInput.getSeconds()&0xff) * 1000 // 1000 milliseconds in a second
        - dateInput.getMilliseconds()
    );
}

// Demonstration:
var date = new Date(2100, 0, 1)
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);
date = new Date(1900, 0, 1);
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);

// Performance Benchmark:
console.time("Speed of processing 16384 dates");
for (var i=0,month=date.getMonth()|0; i<16384; i=i+1|0)
    date.setMonth(month=month+1+(dstOffsetAtDate(date)|0)|0);
console.timeEnd("Speed of processing 16384 dates");

我相信以上代码片段比这里发布的所有其他答案都更优秀,原因有很多。
  • 这个答案适用于所有时区,甚至南极洲/凯西
  • 夏令时非常容易改变。也许20年后,某些国家可能有3个夏令时周期而不是正常的2个。此代码通过返回毫秒级别的夏令时偏移量来处理该情况,而不仅仅是判断是否正在实行夏令时。
  • 一年中月份的大小以及闰年的工作方式完美地与我们的时间跟踪太阳相吻合。它工作得如此完美,以至于我们只需要在那里调整几秒钟就可以了(调整)。我们当前的闰年系统自1582年2月24日起生效,并且在可预见的未来内将保持生效。
  • 此代码适用于不使用夏令时的时区。
  • 此代码适用于历史时期,在那之前没有实行夏令时(例如20世纪)。
  • 此代码经过最大限度的整数优化,如果在紧密循环中调用,应该不会出现问题。运行上面的代码片段后,请向下滚动到输出底部查看性能基准。 我的电脑能够在FireFox上在29ms内处理16384个日期。
然而,如果您没有为超过2个夏令时做准备,那么下面的代码可以用来确定夏令时是否生效,作为布尔值。
function isDaylightSavingsInEffect(dateInput) {
    // To satisfy the original question
    return dstOffsetAtDate(dateInput) !== 0;
}

这绝对是最全面的答案。在大多数情况下,它可以完美地工作。不幸的是,它不能处理年份小于100的日期。有什么想法吗?否则,这个答案就是完美的。 - Jason
@Jason,这似乎是一个Y2K问题,其中2位数的年份会加上1900。对我来说,new Date(50,0)会产生 "Sun Jan 01 1950 00:00:00 GMT-0500 (Eastern Standard Time)"。请尝试 dstOffsetAtDate(new Date("0050-06-01 12:00:00")) - Jack G
感谢您的回复@Jack G。通过首先创建日期const date = new Date(50, 0, 1); date.setFullYear(50);,日期已经设置为正确的年份。这是设置日期到正确年份的唯一方法。现在我只是通过前缀fullYear < 100 ? false : ...来解决它。JavaScript日期非常奇怪。再次感谢。 - Jason
1
不幸的是,这只在浏览器中有效,我指的是使用本地时间。没有办法给它另一个时区,除非你当前所在的时区,并查看该时区的夏令时偏移量。 - ioan

4

Moment.js库提供了在其时间对象上使用的.isDst()方法。

moment#isDST检查当前时间是否处于夏令时。

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

我尝试了以下代码:var moment = require('moment'); this.logger.info(moment([2011, 2, 12]).isDST()); this.logger.info(moment([2011, 2, 14]).isDST());两者都是false。 - Logan_B
夏令时更改日期在不同的国家甚至同一国家的州(例如亚利桑那州)也会有所不同。在美国,夏令时更改日期是2011年3月13日,而在德国则是2011年3月31日。因此,结果将取决于moment.js配置的时区。 - Daniel F
1
它甚至在亚利桑那州内部也有所不同 https://www.timeanddate.com/time/us/arizona-no-dst.html - Daniel F
我只有偏移量!如何检查我的日期是否处于夏令时?我尝试了 moment.utc().utcOffset('-05:00').isDST(),但不起作用! - HenonoaH
1
@HenonoaH 这是不可能的,因为它取决于国家,在一些国家甚至在州内也有所不同。您需要知道要确定夏令时状态的位置的时区名称。例如,“Europe/Berlin”或“CEST”(而CEST已经暗示没有夏令时,因为它是“中欧夏令时”或“ET”,存在“EST”和“EDT” https://en.wikipedia.org/wiki/Eastern_Time_Zone)。 - Daniel F
在2021年,moment.js项目建议使用https://moment.github.io/luxon/或其他更小的库https://momentjs.com/docs/#/-project-status/:“现代Web浏览器(和Node.js)通过Intl对象公开国际化和时区支持,这是ECMA-402规范化的。像Luxon(和其他库)这样的库利用此功能,减少或消除了需要自己传输数据文件的需求。” - buzz3791

2

我发现使用Moment.js库与本文所描述的一些概念结合使用非常有效(比较1月和6月)。

这个简单的函数将返回用户所在时区是否遵循夏令时:

function HasDST() {
    return moment([2017, 1, 1]).isDST() != moment([2017, 6, 1]).isDST();
}

检查这是否有效(在Windows上)的简单方法是将您的时区更改为非DST时区,例如亚利桑那州将返回false,而EST或PST将返回true。

enter image description here


2

使用Moment.js (https://momentjs.com/)

moment().isDST();将告诉您是否观察到夏令时。

此外,它还有助手函数可为您计算相对时间。 您不需要手动计算,例如moment("20200105", "YYYYMMDD").fromNow();


1
你有没有注意到“使用Moment.js的答案”已经在2017年被提供了(https://dev59.com/Qmct5IYBdhLWcg3wsfgZ#46547439)? - Dan Dascalescu

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