背景:我用PHP計算從今天起,延遲三個月(三個月不一定是90天,比如從今天的11月30號,延遲三個月就是2月的28號)的日期。java端說他們很好得到這三個月的日期。
疑惑:計算兩個時間之間的日期差我知道,但是計算三個月的我不會。我現在的做法是這樣:
echo floor((strtotime('+3 month') - strtotime(date('Y-m-d')))/86400);
求解:如何用PHP和javascript計算真實日期差。
回複內容:
背景:我用PHP計算從今天起,延遲三個月(三個月不一定是90天,比如從今天的11月30號,延遲三個月就是2月的28號)的日期。java端說他們很好得到這三個月的日期。
疑惑:計算兩個時間之間的日期差我知道,但是計算三個月的我不會。我現在的做法是這樣:
echo floor((strtotime('+3 month') - strtotime(date('Y-m-d')))/86400);
求解:如何用PHP和javascript計算真實日期差。
Moment ( 一款js時間架構 )
文檔地址:http://momentjs.com/#relative-time
jsmoment("20111031", "YYYYMMDD").fromNow(); // 4 years agomoment("20120620", "YYYYMMDD").fromNow(); // 3 years agomoment().startOf('day').fromNow(); // 15 hours agomoment().endOf('day').fromNow(); // in 9 hoursmoment().startOf('hour'
其他使用方式
jsvar date1 = moment('2015-01-01')var date2 = moment('2000-01-01')date1.diff(date2) // 473385600000date1.from(date2) // "in 15 years"
Carbon 可能是 PHP 中時間處理最好的輪子了:http://carbon.nesbot.com/docs/#api-difference
javascript// 之前項目裡用到的實現方式var f = function (date, diff) { var day; if (typeof date == 'string') { // yyyy-mm-dd 不是合法的格式 date = date.replace(/-/g, '/'); } date = new Date(date); day = date.getDate(); diff = ~~diff || 0; date.setMonth(date.getMonth() + diff); // 天數超出目標月的最大天數時,會順延到下個月 // 然後設定下個月的第零天,重設到目標月的最後一天 if (date.getDate() != day) { date.setDate(0); } return date;}f('2014/11/30', 3);
js 版本,
var d = new Date();d.setMonth(d.getMonth() + 3);
我記得php裡面有一個很好用的時間函數,可以直接加月份的,php操作時間最為簡單的,普通地加3 month就好
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Date date=new Date(); String dateString=sdf.format(date); date.setMonth(date.getMonth()+10); String dateString1=sdf.format(date);
======結果=====
2015-06-10 :2016-04-10
這個就要對比php和java的演算法了,php端是這樣理解+n month的
/** * @var $days int 總計天數 * @var $year int 當前年 * @var $month int 當前月 */$days = 0; $year = 2015; $month = 3;/** * @var $n int 幾個月 */for ($i = 0; $i < $n; $i ++) { $_days = getMonthDaysByYearAndMonth($year, $month); $days += $_days; $month ++;}//然後+n month就轉變成 +n days了
但是我不知道java是不是這樣算的,不過邏輯一分析明白了樓主應該理解js端怎麼搞了吧。
例 date('Y-m-d', strtotime('2015-01-30 +1 month') === date('Y-m-d', strtotime('2015-01-30 +31 days') 是3月2號
你的代碼改良一下,話說這樣還不夠簡單嗎?
echo floor((strtotime('+3 month') - time())/86400);
這個有點扯蛋吧,如果今天是2月28日,java能計算出三個月以後的今天是5月30日,那5月28號怎麼辦?沒有那個語言這麼智能。
你想要這種結果(基於當前日期離下一個月1號的距離) ,php也是可以做到的。
echo date('Y-m-d',strtotime('last day of +3 month')-(strtotime('last day of this month')-strtotime('today')));
先計算這個月離下個月1號的距離,然後在當前月底加上3個月,減去這個距離。
顯然這個是任何語言都能實現的。
phpdate('Y-m-d',strtotime('-3 months'));
問題沒看明白,是要「今天」延遲3個月的時間嗎?
如果只要是延遲3個月是幾號:
phpdate('d',strtotime('-3 months'));