Perl - 在 MS Windows 和 Linux 上计算两个日期之间的天数差

J·多伊

我的脚本计算两个日期之间的天数差异。但是,我一直遇到错误。该解决方案必须适用于所有操作系统。建议在 UNIX 时代进行,但如果不可能,那么可能有另一种解决方案。

我试过:
Time::ParseDate- 不适用于 MS Windows
Time::Local- 不适用于当月 31 日之后的日期

示例代码:

#!/usr/bin/perl -w
use strict;
use Time::Local;
use POSIX;

sub toepoch {
  my @a = split /[- :]/, $_[0];
  $a[0] =~ s/^.{2}//;
  if (! defined $a[5]) {
    $a[5] = 00
  }
  my $b = timelocal($a[5], $a[4], $a[3], $a[2], $a[1], $a[0]);
  return $b;
}

my $days = sprintf("%d",(&toepoch('2018-03-31 11:00') - &toepoch('2018-04-02 11:00') / 86400));
print $days;

输出: Day '31' out of range 1..30 at epoch.pl line 12.

接下来我应该检查哪个模块?我提醒您,该解决方案必须适用于 UNIX 和 MS Windows 系统。

西尔瓦

从文档中Time::Local

值得特别注意所提供值的预期范围。月中天的值是实际天数(即 1..31),而月份是自 1 月以来的月数 (0..11)。这与从“localtime()”和“gmtime()”返回的值一致。

因此,通过提供timelocal数组,(0, 00, 11, 31, 03, 18)您将尝试使用第 4 个月的第 31 天,因为 4 月只有 30 天,因此这不起作用。如果只有错误消息包含它假设的月份!

进行转换时,您需要注意将月份值保持在 0..11 以内,并相应地调整年份。

(或者,您可以使用timelocal_nocheck()允许输入月份 -1 并让该函数执行到前一年的转换。虽然如果您确实使用了该函数,您将遇到一个更难追踪的错误,因为它会自动将 4 月 31 日转换为 5 月 1 日,您不知道为什么您的时差只有 1 天。)

其次,你在计算行上有一个错位的括号,所以你只将后面的时间除以 86400。

我编辑的代码:

use strict;
use warnings;

use Time::Local;
use POSIX;

sub toepoch {
    my @a = split /[- :]/, $_[0];
    $a[0] =~ s/^.{2}//;
    if (! defined $a[5]) {
        $a[5] = 00
    }
    --$a[1];
    if ($a[1] < 0) {
        --$a[0];
        $a[1] += 12;
    }
    my $b = timelocal($a[5], $a[4], $a[3], $a[2], $a[1], $a[0]);
    return $b;
}

my $days = sprintf("%d",(&toepoch('2018-03-31 11:00') - &toepoch('2018-04-02 11:00')) / 86400);
print $days;

输出:

-2

编辑:

我假设您%d在对值使用格式时知道自己在做什么- 它将值截断为下一个整数,这意味着如果您有日期

2018-03-31 11:00
2018-04-02 10:59

也就是说,仅比 2 天少 1 分钟,您的程序会将时差报告为“-1”。

要四舍五入到最接近的整数,请改用格式%.0f

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在两个日期之间选择 MS Access 和 php

来自分类Dev

Perl正则表达式替换斜杠以在Windows和Linux之间转换路径

来自分类Dev

如何通过JavaScript计算两个日期之间的月份和天数?

来自分类Dev

如何使用公历和 While 循环计算两个日期之间的天数

来自分类Dev

计算天数,小时和两个时刻之间分钟

来自分类Dev

如何获得两个日期之间的月份和天数

来自分类Dev

减去我的计算机和Linux服务器之间的两个日期时的两个不同结果

来自分类Dev

以下两个代码之间的区别[和(在perl中?

来自分类Dev

Linux和Windows之间的numpy性能差异

来自分类Dev

在Windows和Linux机器之间传输文件?

来自分类Dev

Windows和Linux之间的文件差异

来自分类Dev

FFmpeg Windows和Linux之间的不同功能

来自分类Dev

Windows 和 Linux 之间 QT 的形式差异

来自分类Dev

MS-Access,两个日期之间的天数,基于一个值

来自分类Dev

如何计算具有两个向量(开始日期和结束日期)和日期向量的数据框之间匹配的天数?

来自分类Dev

如何获取两个Java日期之间的天数,同时比较日期和时间

来自分类Dev

如何获取两个Java日期之间的天数,同时比较日期和时间

来自分类Dev

如何获得天数,小时数,分钟数和秒数之间的两个日期之间的差异

来自分类Dev

计算两个日期之间的整年和部分月份

来自分类Dev

Perl和哈希计算

来自分类Dev

Windows CMD Line中的Perl和Regex

来自分类Dev

Perl:Windows和Unix上的exec()

来自分类Dev

Strawberry Perl - 在 Windows 中搜索和替换

来自分类Dev

MySQL-获取年龄和两个日期之间的天数

来自分类Dev

C编程:使用结构和函数确定两个日期之间的天数

来自分类Dev

Excel-两个日期和时间之间的天数差异

来自分类Dev

Oracle:两个日期之间的天数和排除工作日如何处理负数

来自分类Dev

本征:log()的计算限制是什么?(Windows和Linux)

来自分类Dev

Windows和Linux之间是否兼容git版本

Related 相关文章

  1. 1

    在两个日期之间选择 MS Access 和 php

  2. 2

    Perl正则表达式替换斜杠以在Windows和Linux之间转换路径

  3. 3

    如何通过JavaScript计算两个日期之间的月份和天数?

  4. 4

    如何使用公历和 While 循环计算两个日期之间的天数

  5. 5

    计算天数,小时和两个时刻之间分钟

  6. 6

    如何获得两个日期之间的月份和天数

  7. 7

    减去我的计算机和Linux服务器之间的两个日期时的两个不同结果

  8. 8

    以下两个代码之间的区别[和(在perl中?

  9. 9

    Linux和Windows之间的numpy性能差异

  10. 10

    在Windows和Linux机器之间传输文件?

  11. 11

    Windows和Linux之间的文件差异

  12. 12

    FFmpeg Windows和Linux之间的不同功能

  13. 13

    Windows 和 Linux 之间 QT 的形式差异

  14. 14

    MS-Access,两个日期之间的天数,基于一个值

  15. 15

    如何计算具有两个向量(开始日期和结束日期)和日期向量的数据框之间匹配的天数?

  16. 16

    如何获取两个Java日期之间的天数,同时比较日期和时间

  17. 17

    如何获取两个Java日期之间的天数,同时比较日期和时间

  18. 18

    如何获得天数,小时数,分钟数和秒数之间的两个日期之间的差异

  19. 19

    计算两个日期之间的整年和部分月份

  20. 20

    Perl和哈希计算

  21. 21

    Windows CMD Line中的Perl和Regex

  22. 22

    Perl:Windows和Unix上的exec()

  23. 23

    Strawberry Perl - 在 Windows 中搜索和替换

  24. 24

    MySQL-获取年龄和两个日期之间的天数

  25. 25

    C编程:使用结构和函数确定两个日期之间的天数

  26. 26

    Excel-两个日期和时间之间的天数差异

  27. 27

    Oracle:两个日期之间的天数和排除工作日如何处理负数

  28. 28

    本征:log()的计算限制是什么?(Windows和Linux)

  29. 29

    Windows和Linux之间是否兼容git版本

热门标签

归档