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

問題は、Javascript では 4 月が 3 であるときに、4 月が 4 であることに月を基づいていることです。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 に答える
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 に答える