ksi*_*mka 3 php localization date internationalization
\n\n\n首先:我知道我可以为每个语言环境手动创建一堆具有相应模式的配置文件;实际上,我尝试找到仅使用 IntlDateFormatter 的解决方法。
\n
我将尝试用例子来解释。
\n\n<?php\n\n$tz = new DateTimeZone(\'Europe/Moscow\');\n$now = time();\nforeach ([\'en_US\', \'ja_JA\', \'ru_RU\'] as $locale) {\n printf("%s:\\n", $locale);\n\n foreach ([IntlDateFormatter::MEDIUM, IntlDateFormatter::LONG] as $datetype) {\n $formatter = new IntlDateFormatter($locale, $datetype, IntlDateFormatter::NONE);\n printf("- %s\\n", $formatter->format($now));\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n这会产生
\n\nen_US:\n- Feb 1, 2016\n- February 1, 2016\nja_JA:\n- 2016/02/01\n- 2016\xe5\xb9\xb42\xe6\x9c\x881\xe6\x97\xa5\nru_RU:\n- 1 \xd1\x84\xd0\xb5\xd0\xb2\xd1\x80. 2016 \xd0\xb3.\n- 1 \xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8f 2016 \xd0\xb3.\nRun Code Online (Sandbox Code Playgroud)\n\n我需要
\n\nen_US:\n- Feb 1\n- February 1\nja_JA:\n- 02/01\n- 2\xe6\x9c\x881\xe6\x97\xa5\nru_RU:\n- 1 \xd1\x84\xd0\xb5\xd0\xb2\xd1\x80.\n- 1 \xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8f\nRun Code Online (Sandbox Code Playgroud)\n\n第一个想法是提取给定区域设置的模式并删除任何“y”和“Y”字母。但正如您所看到的,不仅仅是 4 位数的年份:所有逗号、斜杠、标签(如 \'\xd0\xb3.\' 和 \'\xe5\xb9\xb4\')。
\n\n附:
\n\n实际上,我想要的理想IntlDateFormatter实现是一个智能模式,其中所有组件都在其位置,但我可以配置每个组件使用的模式。就像:格式化程序\'d MMMM y \xd0\xb3.\'的模式不是模式,组件的模式是-和- 。所以我可以说组件是一个\'\'(空字符串),瞧。ru_RU\'dmy\'ddmMMMMyy \xd0\xb3.y
另外,如果您知道任何库已经执行此操作 \xe2\x80\x94,请告诉我。
\n所以,目前来说这是不可能的。我发现intlPHP 扩展根本缺少DateTimePatternGenerator( http://userguide.icu-project.org/formatparse/datetime),这正是我所需要的。
\n\nDateTimePatternGenerator 类提供了一种将对一组日期/时间字段及其宽度的请求映射到适合区域设置的格式模式的方法。该请求采用 \xe2\x80\x9csculpture\xe2\x80\x9d 的形式,其中仅包含使用所需宽度表示的所需字段的模式字母。在骨架中,除了模式字母之外的任何内容都会被忽略,字段顺序无关紧要,并且可以使用两个特殊的附加模式字母:\'j\' 请求区域设置的首选小时周期类型(它被映射为 \'H\'、\'h\'、\'k\' 或 \'K\' 之一);\'J\' 类似,但不请求 AM/PM 标记,即使 locale\xe2\x80\x99s 的首选小时周期类型是 \'h\' 或 \'K\'。
\n例如,\xe2\x80\x9cMMMMdjmm\xe2\x80\x9d 的骨架可能会导致不同区域设置的以下格式模式:
\n\n语言环境 | 骨架的格式模式 \xe2\x80\x9cMMMMdjmm\xe2\x80\x9d | 示例\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~\nen_US "MMMM d \'at\' h:mm a" 4 月 2 日下午 5:00\nes_ES "d \'de\' MMMM , H:mm" 4 月 2 日,17:00\nja_JP "M\xe6\x9c\x88d\xe6\x97\xa5 H:mm" 4\xe6\x9c\x882\xe6\x97\xa5 17:00\n\n
另外,我发现 HHVM 已经实现了它 \xe2\x80\x94 https://github.com/facebook/hhvm/commit/bc84daf7816e4cd268da59d535dcadfc6cf01085。我希望有一天它能被移植到 PHP。
\nUPD:我已经写了一篇关于问题 \xe2\x80\x94 的长文https://blog.ksimka.com/a-long-journey-to-formatting-a-date-without-a-year-internationally -with-php/
\n