Home > Backend Development > PHP Tutorial > javascript - 关于计算日期差。

javascript - 关于计算日期差。

WBOY
Release: 2016-06-06 20:33:08
Original
1250 people have browsed it

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

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

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

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

回复内容:

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

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

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

求解:如何用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>
Copy after login

其他使用方式

<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>
Copy after login

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>
Copy after login

js 版本,

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

我记得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>
Copy after login

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

<code>2015-06-10  :2016-04-10
</code>
Copy after login

这个就要对比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>
Copy after login

但是我不知道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>
Copy after login

这个有点扯蛋吧,如果今天是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>
Copy after login

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

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

<code>php</code><code>date('d',strtotime('-3 months'));
</code>
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template