我正在阅读用户在我的Ruby on Rails应用程序中上传的csv数据。当用户指定特定列具有日期(或时间)时,我希望能够自动检测格式。这意味着它可以采用美国或英国格式(dd / mm / yy,mm / dd / yy,yyyy-mm-dd,2010年2月12日等等)
我在Ruby中尝试过parsedate但它不适用于美国和英国的日期,除非你指定格式。有没有办法真正做到这一点,还是我要求太多?我不介意只为这一项任务调用另一种语言的脚本。我想知道它是如何在Excel和Google文档等程序中处理的。
答案 0 :(得分:1)
除非应用程序有位置,否则我不知道如何准确地确定它。
但你知道的是:
您可以使用这些规则编写自己的解析器来解决问题。然而,它可以(没有应用地点)将2010年10月5日或2010年5月10日的英国误解为05/10/2010。
答案 1 :(得分:1)
程序可以做很少的事情来神奇地确定它是哪种类型的短日期格式。
如果你给节目一个像09/06/08这样的日期,那可能意味着:
当Ruby从字符串中解析日期时,它将使用默认格式提供程序来确定日期的格式。有关详细信息,请参阅Ruby DateTime class文档。
我认为在您的情况下最好的做法是尝试将所有记录安排到组中,其中每个组都有一种特定的日期格式。如果您自己无法通过某种标准手动确定美国和英国日期之间的差异,那么很遗憾,程序也无法实现。
但是......如果每个用户都来自特定区域设置,并且您可以(以相当大)假设他们在CSV上传的每个日期符合其所在国家/地区的日期格式标准,那么可以利用国际化API。技术上应该可以获取特定用户的语言环境,然后加载正确的i18n数据(使用适当的日期格式化程序),并使用格式化程序i18n为您提供解析文件。阅读Rails Internationalization API指南,了解如何使用i18n API。
答案 2 :(得分:1)
我知道这是一篇过时的文章,但是出于档案的缘故,我建议使用Chronic gem来解析CSV导入中的日期/时间。
Chronic.parse("8/15/2020") # => 2020-08-15 12:00:00 -0000
Chronic.parse("15/8/2020") # => 2020-08-15 12:00:00 -0000
Chronic.parse("8-15-2020") # => 2020-08-15 12:00:00 -0000
Chronic.parse("8-15-2020 3PM") # => 2020-08-15 15:00:00 -0000
仅供参考,您需要告诉Chronic在客户的帐户时区中进行解析。否则,它将使用全局配置的时区(在我的示例中为UTC)。