将navigator.locale格式的日期转换为数据库日期

时间:2017-10-26 15:54:51

标签: javascript date

我的日期采用navigator.locale定义的格式,所以我们事先并不知道它是哪一个。

在我的情况下,我有一些法语日期,因为我的导航语言设置为法语。实际上,如果我查看浏览器支持的语言,我可以看到(在浏览器中使用开发者控制台):

  

> navigator.locales

     

['fr-FR', 'fr', 'en-US', 'en']

如果我检查当前的语言环境,我会得到:

  

> navigator.locale

     

'fr'

在输入中,我有一个存储在变量中的日期:

  

> console.log(date)

     

20/12/2017

指向2017年12月20日。

所以我想要的是检索这个日期的英文表示(格式未知)。

问题

  1. 如何使用Date()作为javascript的唯一提示,以未知格式创建navigator.locale对象?
  2. 替代方法,我们可以使用Intl.DateTimeFormat使用navigator.locale从格式解析日期吗?
  3. 为什么我需要从navigator.locale开始?

    我没有解释简化问题的原因:我有一个DataTable代码解析包含日期的一些信息的json。这个日期来自一个数据库(MySQL字段类型DATE)所以它是英文格式(例如yyyy-mm-dd),我使用Ìntl.DateTimeFormat解析这个日期以将其格式化为当前的语言环境用户的浏览器。但由于格式可能包含插件无法理解的某些字符以对此日期列进行排序,因此我必须覆盖data-order属性并放回英语格式化日期。对于已经解决了Datatable的问题,我使用dataSrc函数回调来格式化日期,并使用rowCallback尝试使用data-order属性更改单元格。

2 个答案:

答案 0 :(得分:0)

对于那些可能会遇到这种情况的人来说,我使用了一些灵感来找到解决方案:

// Credit : https://stackoverflow.com/a/41751476/3753055

// From english/database to <your_language>
var database_date = new Date('2017-12-20');
var french_date = new Intl.DateTimeFormat().format(database_date);
console.log('french_date: ' + french_date);

// From <your_language> to english/database
var locale = window.navigator.userLanguage || window.navigator.language;
console.log('navigator language: ' + locale);

moment.locale(locale);

var localeData = moment.localeData();
var format = localeData.longDateFormat('L');
var database_date_retreived = moment(french_date, format).format('YYYY-MM-DD');

console.log('Result: ' + database_date_retreived);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

诀窍是使用localeData从区域设置中检索格式信息(希望moment.js了解alpha_2国家/地区代码)。使用此代码段,您可以虚拟地获取任何国家/地区的任何格式,并使用时刻从格式(重要)初始化新日期。然后,很容易格式化为所需的格式,这里我想要典型的数据库/英文格式yyyy-mm-dd

使用日期和时间 您只需抓取var formatTime = localeData.longDateFormat('LTS');,将format变量与空格连接即可,您可以检索日期时间格式。

答案 1 :(得分:0)

  

如何使用navigator.locale作为javascript的唯一提示,从未知格式创建Date()对象?

你无法可靠地做到这一点。浏览器语言没有定义用户可能使用的格式。

如果格式未知,您可以做的最好的是猜测(不推荐)。如果用户可以以自由文本形式输入日期,则应指定所需格式,然后验证:

  1. 符合所需格式
  2. 这是一个有效的日期
  3. 根据所需格式进行分析时,它表示用户期望其表示的日期(例如,解析它并以明确的格式显示结果日期,例如&#34; 2017年1月24日和#34;)
  4. 或者,提供明确的UI控件,以便用户选择值,例如单独的日,月和年控件或日历样式的日期选择器。

      

    替代方法,我们可以使用Intl.DateTimeFormat从使用navigator.locale的格式解析日期吗?

    没有。 Intl.DateTimeFormat没有定义解析(输入)格式,只有输出格式。

    出于某种原因,维护和更新ECMA-262的TC39委员会多年来几乎忽略了Date对象。它非常需要一个合适的解析器和格式化程序,Intl对象不能帮助解析,并且不适合大多数用例的格式化,尽管它确实有一些很好的功能。

    在其他语言和现有的javascript库中有很多很好的解析器和格式化程序可以基于新的解析和格式化功能。它们也可以通过扩展缺少支持的Date或Date.prototype对象来轻松修补。