javascript - 關於計算日期差。

來源:互聯網
上載者:User
背景:我用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'));
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.