Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse date with moment.js with locales

I am getting an "Invalid date" error when I translate my dates from Spanish to English with moment.js (with locales). The weird thing here, is that only fails with some dates.

I have a list of dates, apparently of the same format (they were parsed before using the same library). Then when I parsed it again after change the moment.js locale (To translate my dates to the desired language) I get this:

Enero 13º 2017, 6:00:02 Am --> Invalid date
Abril 17º 2017, 7:36:03 Pm --> Invalid date
Abril 17º 2017, 6:00:01 Am --> Invalid date
Mayo 12º 2017, 2:04:19 Pm   --> May 12th 2017, 2:04:19 Pm
Abril 17º 2017, 11:47:17 Pm --> Invalid date

Parse Method (format is initialized here because in other moments it can get other values):

format = 'MMMM Do YYYY, h:mm:ss a';
$(".videoDate").each(function(){
    var _text = $(this).text();//Extract initial date
    var _date = moment(_text, format).format('MMMM Do YYYY, h:mm:ss a');//format
    $(this).text(_date);//new date setting
});

http://jsfiddle.net/gr1zdtag/

Maybe I am missing something but I don't find the reason yet. Can any help me with this problem?

like image 618
Genaut Avatar asked Dec 09 '17 12:12

Genaut


People also ask

How do you compare dates with moments?

Compare two dates using Moment.js has a diff() method, which gives the difference between two dates in years, months, days, hours, minutes, seconds, milliseconds, etc. We can use the second unit in our case to find the difference between the two dates. Before using the Moment. js methods, make sure to include Moment.

Is MomentJS being deprecated?

js is deprecated, the development team recommends to use date-fns instead. - Thibault Goudouneix - Medium. In fact moment. js is deprecated, the development team recommends to use date-fns instead.

What is _D and _I in moment?

_i can also be undefined, in the case of creating the current moment with moment() . _d is the instance of the Date object that backs the moment object. If you are in "local mode", then _d will have the same local date and time as the moment object exhibits with the public API.


1 Answers

You can specify locale when parsing non-english input. You can use moment(String, String, String):

As of version 2.0.0, a locale key can be passed as the third parameter to moment() and moment.utc().

You can use locale() function to change locale of a given moment object (while moment.locale() changes locale globally).

Here a working sample:

var format = 'MMMM Do YYYY, h:mm:ss a';
$(".videoDate").each(function(){
    var _text = $(this).text();//Extract initial date
    //Parse in spanish and convert it in english
    var _date = moment(_text, format, 'es')
                  .locale('en')
                  .format('MMMM Do YYYY, h:mm:ss a');//format
    $(this).text(_date);//new date setting
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment-with-locales.min.js"></script>

<ul>
  <li class="videoDate">Enero 13º 2017, 6:00:02 Am</li>
  <li class="videoDate">Abril 17º 2017, 7:36:03 Pm</li>
  <li class="videoDate">Abril 17º 2017, 6:00:01 Am</li>
  <li class="videoDate">Mayo 12º 2017, 2:04:19 Pm</li>
  <li class="videoDate">Abril 17º 2017, 11:47:1</li>
</ul>

Mayo 12º 2017, 2:04:19 Pm is recognized beacuse by default moment parses strings using english locale and Moment's parser is very forgiving. Mayo contains May so it is considered a valid month name (using forgiving mode).

like image 155
VincenzoC Avatar answered Sep 21 '22 11:09

VincenzoC