12

我试过这个但它失败了

var diffDays1=(function(){ 
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var secondDate = new Date(new Date().getFullYear()+1,4,5);
var firstDate = new Date();
 return Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
})();

Wolfram alpha 说它是 330 天,diffDays1 显示它是 359。这可能是由于夏令时或其他原因。有没有一种方法可以准确计算天数,因为无需在服务器端进行操作。

4

5 回答 5

21

问题是你的月份是 4 月 4 日,而 Javascript 中的 4 月是 3 日。请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date#Parameters

var diffDays1=(function(){ 
    var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
    var secondDate = new Date(new Date().getFullYear()+1,3,5);
    var firstDate = new Date();
    return Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
})();
于 2013-05-10T14:52:03.373 回答
5

为什么要重新发明轮子??使用datejs

之后:

var startd = Date.parseExact(ind, "yyyy-MM-dd");
var endd = Date.parseExact(end, "yyyy-MM-dd");
var diff = new Date(endd - startd);
var days = diff/1000/60/60/24;

这就是所有的人!

于 2013-05-10T15:00:40.720 回答
2

moment.js 库 ( http://momentjs.com ) 可以非常轻松且出色地处理此问题以及许多其他 JavaScript 日期问题。diff 函数 ( http://momentjs.com/docs/#/displaying/difference/ ) 将完全满足您的需求。

fromNow 函数也非常好,如果要显示从现在开始的天数,您可以执行以下操作:

moment([2014, 4, 5]).fromNow();

如果离它还有 330 天,会产生类似“330 天”的东西。

http://momentjs.com/docs/#/displaying/fromnow/

于 2013-05-10T15:13:59.277 回答
2

这是一个使用 moment 的更清洁的解决方案,它可以正确处理所有情况(包括今天、今年即将到来的生日或直到明年、时区、闰年等):

const birthdate = '2018-12-15';
const today = moment().format('YYYY-MM-DD');
const years = moment().diff(birthdate, 'years');
const adjustToday = birthdate.substring(5) === today.substring(5) ? 0 : 1;
const nextBirthday = moment(birthdate).add(years + adjustToday, 'years');
const daysUntilBirthday = nextBirthday.diff(today, 'days');

简单、快速、准确!

这是相同的代码,解释如下:

// This is the birthdate we're checking, in ISO 8601 format
const birthdate = '2018-12-15';

// Get today's date in ISO 8601 format
const today = moment().format('YYYY-MM-DD');

// Calculate current age of person in years (moment truncates by default)
const years = moment().diff(birthdate, 'years');

// Special case if birthday is today; we do NOT need an extra year added
const adjustToday = birthdate.substring(5) === today.substring(5) ? 0 : 1;

// Add age plus one year (unless birthday is today) to get next birthday
const nextBirthday = moment(birthdate).add(years + adjustToday, 'years');

// Final calculation in days
const daysUntilBirthday = nextBirthday.diff(today, 'days');

如果生日是今天,则结果为 0;如果是明天,则结果为 1,以此类推。

于 2018-12-01T14:36:17.407 回答
0

如果生日是今年,则所选解决方案不起作用,因为 getFullYear 的总和为 1。

这是我的解决方案,它还可以防止两种极端情况:今天生日和剩余 1 天。

const birthdayDay = 19;
const birthdayMonth = 11; // december === 11
const myBirthdayThisYear = new Date(new Date().getFullYear(), 11, 19).setHours(23, 59, 59);

export const daysUntilBirthday = () => {
  const addToYear = myBirthdayThisYear > Date.now() ? 0 : 1;
  const oneDay = 24 * 60 * 60 * 1000;
  const secondDate = new Date(new Date().getFullYear() + addToYear, birthdayMonth, birthdayDay);
  const firstDate = new Date();
  const days = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime()) / (oneDay)));
  const daysOrDay = days === 1 ? 'day' : 'days';
  return days !== 365 ? `${days} ${daysOrDay} until my birthday ` : ' TODAY IS MY BIRTHDAY ';
};
于 2018-11-20T04:23:07.707 回答