>백엔드 개발 >PHP 튜토리얼 >javascript - 关于计算日期差。

javascript - 关于计算日期差。

WBOY
WBOY원래의
2016-06-06 20:33:081250검색

背景:我用PHP计算从今天起,推迟三个月(三个月不一定是90天,比如从今天的11月30号,推迟三个月就是2月的28号)的日期。java端说他们很好得到这三个月的日期。

疑惑:计算两个时间之间的日期差我知道,但是计算三个月的我不会。我现在的做法是这样:

<code>   echo  floor((strtotime('+3 month') - strtotime(date('Y-m-d')))/86400);
</code>

求解:如何用PHP和javascript计算真实日期差。

回复内容:

背景:我用PHP计算从今天起,推迟三个月(三个月不一定是90天,比如从今天的11月30号,推迟三个月就是2月的28号)的日期。java端说他们很好得到这三个月的日期。

疑惑:计算两个时间之间的日期差我知道,但是计算三个月的我不会。我现在的做法是这样:

<code>   echo  floor((strtotime('+3 month') - strtotime(date('Y-m-d')))/86400);
</code>

求解:如何用PHP和javascript计算真实日期差。

Moment ( 一款js时间框架 )

文档地址:http://momentjs.com/#relative-time

<code>js</code><code>moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 15 hours ago
moment().endOf('day').fromNow();          // in 9 hours
moment().startOf('hour'
</code>

其他使用方式

<code>js</code><code>var date1 = moment('2015-01-01')
var date2 = moment('2000-01-01')
date1.diff(date2)  // 473385600000
date1.from(date2)  // "in 15 years"
</code>

Carbon 可能是 PHP 中时间处理最好的轮子了:http://carbon.nesbot.com/docs/#api-difference

<code>javascript</code><code>// 之前项目里用到的实现方式
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);
</code>

js 版本,

<code>var d = new Date();
d.setMonth(d.getMonth() + 3);
</code>

我记得php里面有一个很好用的时间函数,可以直接加月份的,php操作时间最为简单的,普通地加3 month就好

<code>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);
</code>

======结果=====

<code>2015-06-10  :2016-04-10
</code>

这个就要对比php和java的算法了,php端是这样理解+n month的

<code>/**
 * @var $days int 总计天数
 * @var $year int 当前年
 * @var $month int 当前月
 */
$days = 0; $year = 2015; $month = 3;
/**
 * @var $n int 几个月
 */
for ($i = 0; $i </code>

但是我不知道java是不是这样算的,不过逻辑一分析明白了楼主应该理解js端怎么搞了吧。

例 date('Y-m-d', strtotime('2015-01-30 +1 month') === date('Y-m-d', strtotime('2015-01-30 +31 days') 是3月2号

你的代码改良一下,话说这样还不够简单吗?

<code>echo  floor((strtotime('+3 month') - time())/86400);
</code>

这个有点扯蛋吧,如果今天是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个月,减去这个距离。
显然这个是任何语言都能实现的。

<code>php</code><code>date('Y-m-d',strtotime('-3 months'));
</code>

问题没看明白,是要「今天」推迟3个月的时间吗?

如果只要是推迟3个月是几号:

<code>php</code><code>date('d',strtotime('-3 months'));
</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.