当前位置: 首页 > 知识库问答 >
问题:

2月1日至3月1日之间的碳扩散月数不正确

萧英光
2023-03-14

我发现一个奇怪的结果,当我使用扩散数月的拉维碳。谁能为我解释一下为什么它是这样工作的。是虫子吗?以及如何使其正确。

$d1 = new Carbon('2018-02-01');
$d2 = new Carbon('2018-03-01');
dd($d1->diffInMonths($d2));

产量为: 0(预期: 1)

但是

$d1 = new Carbon('2018-02-02');
$d2 = new Carbon('2018-03-02');
dd($d1->diffInMonths($d2));

产出为:1

我设置的时区是“亚洲/胡志明”(GMT 7)。PHP版本7.0.22。操作系统:Ubuntu服务器16.04

这个奇怪的结果只发生在2月1日到3月1日之间,其他月份的结果也是意料之中的。

我也尝试date_diff而不是Carbon

$d1 = new \DateTime('2018-02-01');
$d2 = new \DateTime('2018-03-01');
$diff = date_diff($d1,$d2);
dump($diff->m);
dump($diff->d);
die;

它返回月份:0,天数:28(不是预期的月份:1,天数:0)

所以问题可能来自PHP,而不是Carbon。

共有3个答案

吕灿
2023-03-14

我认为将时区设置为UTC应该可以解决这个问题。当时区设置为Europe/Zurich时,我也遇到了同样的问题:

>>> $last = new \Carbon\Carbon('2019-02-01');
=> Carbon\Carbon @1548975600 {#2381
     date: 2019-02-01 00:00:00.0 Europe/Zurich (+01:00),
   }
>>> $now = (\Carbon\Carbon::now())->day(1)->setTime(0, 0, 0);
=> Carbon\Carbon @1551394800 {#2371
     date: 2019-03-01 00:00:00.0 Europe/Zurich (+01:00),
   }
>>> $now->diffInMonths($last)
=> 0

将时区更改为UTC后:

>>> $last = new \Carbon\Carbon('2019-02-01', 'UTC');
=> Carbon\Carbon @1548979200 {#2380
     date: 2019-02-01 00:00:00.0 UTC (+00:00),
   }
>>> $now = (\Carbon\Carbon::now('UTC'))->day(1)->setTime(0, 0, 0);
=> Carbon\Carbon @1551398400 {#2394
     date: 2019-03-01 00:00:00.0 UTC (+00:00),
   }
>>> $now->diffInMonths($last)
=> 1
方恺
2023-03-14

您提供的代码应该可以工作。尽管你可以尝试碳的替代品。试试DateTime

$d1 = new DateTime('2018-02-01');
$d2 = new DateTime('2018-03-01');
$diff = date_diff($d1,$d2);
dd($diff->m);
裴英才
2023-03-14

你应该用碳来设置时区,现在它可以工作了:

   Carbon::now(new \DateTimeZone('Asia/Ho_Chi_Minh'));
    $d1 = new Carbon('2018-02-01');
    $d2 = new Carbon('2018-03-01');
    dd($d1->diffInMonths($d2));
 类似资料:
  • 问题内容: 该的getTime()获取以毫秒为某一特定日期时间。能否可靠地用于18世纪的约会。我们使用Millis并将其存储在字符串变量中以备将来比较。过去可以使用多长时间有限制? 问题答案: 如果您要比较遥远的过去的日期/时间,我强烈建议您看一下JodaTime。或者实际上是任何类型的日期/时间比较和计算。这是一个很棒的图书馆! 不要依靠getTime()做你想做的事情。至少考虑使用Java的C

  • 问题内容: 我在sql server中有一个datetime列及其可选字段,如果用户决定不输入,那么我想在表中插入NULL值,并定义如下内容: 当我插入sql server时,我在asp.net中有此代码 但问题是:其插入 在SQL表而不是 我在这里做错了什么? 更新: 问题答案: 假设您有: 如果您想插入SQL NULL,那么您应该下一步: 意思是: 如果要在函数中注意可空的datetime,则

  • 因此,我想将x轴范围设置为从1月到12月。所以x_data和y_data是动态的,例如x_data = [ 'Jan', 'Feb] 和 y_data = [10, 20]。所以图表在 x 轴上只显示两个值(仅限 jan 和 feb),但如果数据不可用,我希望所有月份都在 x 轴上。我试图将xaxis的范围设置为[“1月”,“2月”,“3月”,“4月”,“5月”,“6月”,“7月”,“8月”,“9

  • 我想在excel-vba中编写一个代码,在工作表的一列中填充特定年份的日期。< br >该准则还应考虑闰年。比方说,我已经在单元格B1中输入了年份(如2020年),因此列A应该填充366个日期条目(考虑到闰年)。

  • 问题内容: 我正在使用以下代码 输出是 添加到 一月 是给 月 月。如果我们在当前日期加上30天,则可能返回正确的输出。但我想显示 2 月。有人可以帮我吗.. 问题答案: 您可以看到+1设置字段添加的日期与您的日期不同(从输出中观察到)。 如果你想几个月,那么使用代码