繁体   English   中英

如何使用人性化日期在 JS 中获得本地化的持续时间?

[英]How using humanized date can I get localized duration in JS?

我有以下日期的 JSON 对象:

[
  {
    "date_start": "septembre 2019",
    "date_end": "septembre 2020"
  },
  {
    "date_start": "juin 2017",
    "date_end": "avril 2019"
  },
  {
    "date_start": "novembre 2015",
    "date_end": "Aujourd'hui"
  },
  {
    "date_start": "novembre 2012",
    "date_end": "février 2015"
  },
  {
    "date_start": "novembre 2011",
    "date_end": "octobre 2012"
  }
]

我想将这些人性化的日期转换为en_USfr_FR的本地化持续时间。

这是en_US的预期结果

持续时间语法不必严格使用本示例中的语法!

[
  {
    "date_start": "september 2019",
    "date_end": "september 2020",
    "duration": "1 yrs 1 mo"
  }
]

我正在查看date-fns ,到目前为止我还没有找到如何去做。 (我还检查了momentjs )。

有谁知道我如何在人性化的持续时间内转换那些? 我认为这应该首先转换为日期。

您可以使用这个简单的纯 JS 代码。

这个怎么运作:

frStringToDate()函数将您的字符串转换为 Date 对象。 它首先检查字符串格式,然后从中获取法语月份名称和年份。 然后它将(使用months对象)法语月份名称转换为英文 3 个字符的月份缩写,最终为Date构造函数创建一个可读的字符串。

calculateDuration()函数减去两个日期并将结果(以毫秒为单位)“转换”到Date对象。 我们知道, new Date(0)Jan 1, 1970 ,所以我们可以从结果Date对象的年份中减去 1970 。 要获得月份,我们需要将.getMonth()函数的结果加1 ,因为月份是从 0 开始编号的。然后我们可以返回结果字符串。

getDurationFromObj()只是为了代码可读性

 const months = { 'janvier': 'jan', 'février': 'feb', 'mars': 'mar', 'avril': 'apr', 'mai': 'may', 'juin': 'jun', 'juillet': 'jul', 'août': 'aug', 'septembre': 'sep', 'octobre': 'oct', 'novembre': 'nov', 'décembre': 'dec' } const dates = [{ "date_start": "septembre 2019", "date_end": "septembre 2020" }, { "date_start": "juin 2017", "date_end": "avril 2019" } ] function frStringToDate(frDateString) { const matched = frDateString.match(/^(\\w+) (\\d{4})$/) if (matched) { const frMonth = matched[1] const year = matched[2] const enMonth = months[frMonth] if (!enMonth) return null return new Date(`${enMonth} ${year}`) } return null } function calculateDuration(date1, date2) { const durationMillis = date1 < date2 ? date2 - date1 : date1 - date2 const durationDate = new Date(durationMillis) const years = durationDate.getFullYear() - 1970 const months = durationDate.getMonth() + 1 return `${years} yrs ${months} mo` } function getDurationFromObj(obj) { const date1 = frStringToDate(obj.date_start) const date2 = frStringToDate(obj.date_end) return calculateDuration(date1, date2) } dates.forEach(obj => console.log(getDurationFromObj(obj)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM