是否有一个内置的、可识别语言环境的PHP函数/类要输出;“1小时”&引用;25分钟“&引用;“3天”;等

是否有一个内置的、可识别语言环境的PHP函数/类要输出;“1小时”&引用;25分钟“&引用;“3天”;等,php,date,datetime,time,locale,Php,Date,Datetime,Time,Locale,我已经自己编写了这样一个函数,它只需要两个时间戳,将它们转换为Unix秒数,从另一个中减去一个,然后根据这些秒数确定要计算的分钟数/小时数/指定值 问题: 我的函数只输出英语和德语。如果它存在,我也希望获得所有其他语言/地区的输出 虽然这通常无关紧要,但由于“1年”或“7个月”等“模糊”字符串的性质,对于非常大的时间跨度,我的方法无法正确处理闰年等问题。如果我选择了强制以“天”为单位的参数,并且两个时间戳之间有很多年,那么天数肯定会减少很多天 我相当肯定PHP的DateTime类或其他东西有这样

我已经自己编写了这样一个函数,它只需要两个时间戳,将它们转换为Unix秒数,从另一个中减去一个,然后根据这些秒数确定要计算的分钟数/小时数/指定值

问题:

  • 我的函数只输出英语和德语。如果它存在,我也希望获得所有其他语言/地区的输出
  • 虽然这通常无关紧要,但由于“1年”或“7个月”等“模糊”字符串的性质,对于非常大的时间跨度,我的方法无法正确处理闰年等问题。如果我选择了强制以“天”为单位的参数,并且两个时间戳之间有很多年,那么天数肯定会减少很多天
  • 我相当肯定PHP的DateTime类或其他东西有这样的功能,但我已经查找过了,找不到任何这样的功能。所以也许它不存在

    我想要像这样的东西:

    echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00') . PHP_EOL; // No time unit forced, so it picks the most reasonable one.
    echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'hours') . PHP_EOL; // Force hours.
    echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'days') . PHP_EOL; // Force days.
    echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'minutes') . PHP_EOL; // Force minutes.
    echo human_friendly_time_string('2020-02-09 00:00:00', '2020-02-10 00:00:00', 'days', 1) . PHP_EOL; // Force days, and force one decimal.
    
    要输出(对于英语语言/区域设置):

    再说一次,我自己已经用英语和德语编写了这段代码,所以我对重复这段代码的PHP代码不感兴趣。我只想知道它是否内置在PHP中,如果是的话,如何使用它。

    嗯,有一个方法可以返回一个包含相关信息的对象

    例如:

    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    $diff = $date1->diff($date2);
    
    echo
      $diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
    // Gives you: 1 days,11 hours,16 minutes,42 seconds.
    
    // Calculate the number of seconds between two dates using DateTime
    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    // Most verbosely expressed as...
    $diff = $date1->diff($date2);
    
    $seconds = $diff->days * 24 * 60 * 60;
    $seconds += $diff->h * 60 * 60;
    $seconds += $diff->i * 60;
    $seconds += $diff->s;
    
    // Or more simply just
    $seconds = $date2->getTimestamp() - $date1->getTimestamp();
    
    // Hand it to the formatter
    $fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
    echo $fmt->format($seconds);
    // Gives you 35:16:42
    
    对于i18n,当然有一个基于规则的格式化程序,它也可以处理持续时间

    例如:

    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    $diff = $date1->diff($date2);
    
    echo
      $diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
    // Gives you: 1 days,11 hours,16 minutes,42 seconds.
    
    // Calculate the number of seconds between two dates using DateTime
    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    // Most verbosely expressed as...
    $diff = $date1->diff($date2);
    
    $seconds = $diff->days * 24 * 60 * 60;
    $seconds += $diff->h * 60 * 60;
    $seconds += $diff->i * 60;
    $seconds += $diff->s;
    
    // Or more simply just
    $seconds = $date2->getTimestamp() - $date1->getTimestamp();
    
    // Hand it to the formatter
    $fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
    echo $fmt->format($seconds);
    // Gives you 35:16:42
    
    当然,还有一个对象可以像您在上面的示例中所期望的那样,以更大的粒度完成这项任务

    下面是一个例子:

    $cal1 = IntlCalendar::createInstance('Europe/London', 'de_DE');
    $cal2 = IntlCalendar::createInstance('Europe/London', 'de_DE');
    $cal1 = $cal1->fromDateTime('2020-02-08 12:43:18');
    $cal2 = $cal2->fromDateTime('2020-02-10 00:00:00');
    $time = $cal2->getTime();
    
    echo
    $cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR), " years, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH), " months, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH), " days, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY), " hours, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE), " minutes, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_SECOND), " seconds.";
    
    // Gives you: 0 years, 0 months, 1 days, 11 hours, 16 minutes, 42 seconds.
    
    有一种方法可以返回一个包含相关信息的对象

    例如:

    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    $diff = $date1->diff($date2);
    
    echo
      $diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
    // Gives you: 1 days,11 hours,16 minutes,42 seconds.
    
    // Calculate the number of seconds between two dates using DateTime
    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    // Most verbosely expressed as...
    $diff = $date1->diff($date2);
    
    $seconds = $diff->days * 24 * 60 * 60;
    $seconds += $diff->h * 60 * 60;
    $seconds += $diff->i * 60;
    $seconds += $diff->s;
    
    // Or more simply just
    $seconds = $date2->getTimestamp() - $date1->getTimestamp();
    
    // Hand it to the formatter
    $fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
    echo $fmt->format($seconds);
    // Gives you 35:16:42
    
    对于i18n,当然有一个基于规则的格式化程序,它也可以处理持续时间

    例如:

    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    $diff = $date1->diff($date2);
    
    echo
      $diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
    // Gives you: 1 days,11 hours,16 minutes,42 seconds.
    
    // Calculate the number of seconds between two dates using DateTime
    $date1 = new DateTime('2020-02-08 12:43:18');
    $date2 = new DateTime('2020-02-10 00:00:00');
    
    // Most verbosely expressed as...
    $diff = $date1->diff($date2);
    
    $seconds = $diff->days * 24 * 60 * 60;
    $seconds += $diff->h * 60 * 60;
    $seconds += $diff->i * 60;
    $seconds += $diff->s;
    
    // Or more simply just
    $seconds = $date2->getTimestamp() - $date1->getTimestamp();
    
    // Hand it to the formatter
    $fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
    echo $fmt->format($seconds);
    // Gives you 35:16:42
    
    当然,还有一个对象可以像您在上面的示例中所期望的那样,以更大的粒度完成这项任务

    下面是一个例子:

    $cal1 = IntlCalendar::createInstance('Europe/London', 'de_DE');
    $cal2 = IntlCalendar::createInstance('Europe/London', 'de_DE');
    $cal1 = $cal1->fromDateTime('2020-02-08 12:43:18');
    $cal2 = $cal2->fromDateTime('2020-02-10 00:00:00');
    $time = $cal2->getTime();
    
    echo
    $cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR), " years, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH), " months, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH), " days, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY), " hours, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE), " minutes, ",
    $cal1->fieldDifference($time, IntlCalendar::FIELD_SECOND), " seconds.";
    
    // Gives you: 0 years, 0 months, 1 days, 11 hours, 16 minutes, 42 seconds.
    

    嗯,我不禁注意到,您硬编码了所有字符串,如“年”或“分钟”……对,国际化与翻译无关。这是关于格式的。不同的地区需要以某种方式格式化数字、日期和货币等内容。Intl能为您做的是帮助您简化接收格式化输入和输出正确格式化输出的过程,但它不会为您翻译单词。为此,您需要编写自己的翻译表,并使用gnu之类的工具来处理它们。虽然这些都是相关的问题,但它们通常是两个独立的问题,有着不同的解决方案。例如,“拼写”一词在英语和所有其他语言中都是“ninenty nine”。本质上,提出这个问题的主要目的是为了避免为这些非常常见的东西制作这样的手动翻译表,这些东西是非常合理的,可以预期内置的,并且用于其他东西(但显然不是为了这个)。当然,拼写规则集确实提供了单词,但不是作为翻译。相反,它们是将数字格式化为拼写单词的结果。当然,如果它可以为您提供相同的时差上下文格式,以包括限定的时段,那就太好了。也许libicu中有一些模糊的格式化程序规则可以做到这一点。我只是不知道。但libicu是巨大的。它实际上比整个php项目本身还要大。因此,它甚至可能在php中不可用,因为php只有部分实现。对不起,我帮不上什么忙。在某种程度上,我想如果它不存在(或者在PHP中不存在),这是一件好事。至少这样,我就不会完全浪费这么多时间制作自己的函数了!但也许其他人知道它藏在哪里。(我花了大约20年的时间才发现NumberFormatter的存在!)好吧,我忍不住注意到您硬编码了所有字符串,如“年”或“分钟”……对,国际化与翻译无关。这是关于格式的。不同的地区需要以某种方式格式化数字、日期和货币等内容。Intl能为您做的是帮助您简化接收格式化输入和输出正确格式化输出的过程,但它不会为您翻译单词。为此,您需要编写自己的翻译表,并使用gnu之类的工具来处理它们。虽然这些都是相关的问题,但它们通常是两个独立的问题,有着不同的解决方案。例如,“拼写”一词在英语和所有其他语言中都是“ninenty nine”。本质上,提出这个问题的主要目的是为了避免为这些非常常见的东西制作这样的手动翻译表,这些东西是非常合理的,可以预期内置的,并且用于其他东西(但显然不是为了这个)。当然,拼写规则集确实提供了单词,但不是作为翻译。相反,它们是将数字格式化为拼写单词的结果。当然,如果它可以为您提供相同的时差上下文格式,以包括限定的时段,那就太好了。也许libicu中有一些模糊的格式化程序规则可以做到这一点。我只是不知道。但libicu是巨大的。它实际上比整个php项目本身还要大。因此,它甚至可能在php中不可用,因为php只有部分实现。对不起,我帮不上什么忙。在某种程度上,我想如果它不存在(或者在PHP中不存在),这是一件好事。至少这样,我就不会完全浪费这么多时间制作自己的函数了!但也许其他人知道它藏在哪里。(我花了大约20年的时间才发现数字格式的存在!)