2013-06-13 8 views
6

Я пытаюсь переформатировать дату, которую я получаю от API. В объекте у меня есть:форматирование даты с/без Moment.js

created_at: "2013-06-13T16:29:55.245Z" 

Я хотел бы показать дату как 13.06.2012. Кто-то предложил использовать moment.js. У этого есть тонны документации, но я немного смущен тем, как его использовать. может ли кто-нибудь помочь или предложить более простой способ сделать это?

+0

Вы просто хотите строка перед 'T' будет отформатирована? –

ответ

8

Нет необходимости изменять исходную строку, вы можете просто использовать его как это:

alert(moment("2013-06-13T16:29:55.245Z").format("M/DD/YYYY")); 

Хорошо работает: http://jsfiddle.net/K5ub8/2/

+0

Почему это предупреждение 4? – Anthony

+0

Я обновил скрипку, сейчас предупреждает о дате – Antoine

1

может быть, вы не можете использовать сплит

var tuple = createdAt.split("T"); 
var date = tuple[0]; 
var dateTuple = date.split("-"); 
var day = parseInt(dateTuple[2]); 
var month = parseInt(dateTuple[1]); 
var year = parseInt(dateTuple[0]); 
var newFormatedDate = [ month , day, year ].join("/"); 
+0

-1, Это дает результат '13/06/2013' – Xotic750

+0

Нет ничего страшного, doest он работает для вас сейчас? – Edorka

+0

Лучше, теперь он дает '06/13/2013', но OP хотел' 6/13/2013': http://jsfiddle.net/Xotic750/mRPcP/ – Xotic750

4

В моменты вы может только это сделать

var timeStr = "2013-06-13T16:29:55.245Z", 
 
    newFormat = moment(timeStr).format('M/DD/YYYY'); 
 

 
document.body.textContent = newFormat;
<script src="https://rawgithub.com/timrwood/moment/2.9.0/min/moment.min.js"></script>

Выход

6/13/2013 

без моментов и с использованием чистого манипулирования строками, а не newDate объекта, вы можете сделать

var timeStr = "2013-06-13T16:29:55.245Z", 
 
    temp = timeStr.split("T")[0].split("-").reverse(), 
 
    newFormat; 
 

 
temp[0] = temp.splice(1, 1, temp[0])[0]; 
 
newFormat = temp.join("/"); 
 
if (newFormat.charAt(0) === "0") { 
 
    newFormat = newFormat.slice(1); 
 
} 
 

 
document.body.textContent = newFormat;

Выход

6/13/2013 

При использовании Date объекта см @Antonyanswer. Ответ удален

Или если вам нужно больше cross-browser compatible с объектом Date, но все же синтаксический анализ строки.

var timeStr = "2013-06-13T16:29:55.245Z", 
 
    intermediate = timeStr.split("T"), 
 
    newStr = intermediate[0].split("-").join("/") + " " + intermediate[1].split(".")[0] + " GMT", 
 
    newDate = new Date(newStr), 
 
    newFormat = (1 + newDate.getUTCMonth()) + "/" + newDate.getUTCDate() + "/" + newDate.getFullYear(); 
 

 
document.body.textContent = newFormat;

Выход

6/13/2013 

Наконец, вы можете разделить строку на составные части и подать его в Date.UTC используя эти аргументы, а не позволять Date сделать строку разборе.

дата.UTC (год, месяц, день [, час, минута, секунда, миллисекунда]);

Так что, возможно, теперь вы можете понять, почему люди предлагают использовать moments.js, но до тех пор, пока у вас есть знания, то это не слишком больно, чтобы сделать это самостоятельно без библиотеки.

+0

Мне нравится ваш момент (timeStr) .format ('M/DD/YYYY'); 'подход, но не забудьте упомянуть, что если вы используете, например, '0000-01-01T00: 00: 00.0Z', и они не находятся в часовом поясе GMT ​​или к востоку от него, вплоть до международной даты, это будет означать, что 31 декабря, а не 1 января. Это относится к тем из нас в США, например: для EST нам нужно поставить '05: 00: 00.0Z'. – vapcguy

+0

@vapcguy Должно быть исправлено сейчас, добавлено отсутствующее «GMT» при разборе и указана на Date.UTC при использовании частей. – Xotic750

+0

Я имел в виду больше, чтобы каждый, кроме тех, кто был в GMT, должен был удостовериться, что они учитывали часовые пояса при использовании примеров, чтобы получить его в свое местное время. Легко получить его в GMT/UTC, я больше рассказывал о том, как его извлечь из этого, и моя точка зрения была больше связана с жесткой кодировкой даты. 'Date.UTC()' даст вам миллисекунды с полуночи, 1/1/1970, время UTC, но вам все равно нужно использовать 'new Date()', например 'new Date (Date.UTC (96, 11, 1, 0, 0, 0)); 'чтобы получить дату/время, которое хорошо для вашей локальной области. И использование этих чисел даст мне 30 ноября в 7 часов вечера, а не 1 декабря в 12 часов. – vapcguy

0

Вы можете проверить этот формат времени API - https://www.mashape.com/parsify/format#!endpoint-Time

Я набранный в вашей дате "2013-06-13T16: 29: 55.245Z" и получил следующий ответ -

{ 
    "given": "2013-06-13T16:29:55.245Z", 
    "time": { 
    "daysInMonth": 30, 
    "millisecond": 245, 
    "second": 55, 
    "minute": 29, 
    "hour": 16, 
    "date": 13, 
    "day": 4, 
    "week": 24, 
    "month": 5, 
    "year": 2013, 
    "zone": "+0000" 
}, 
    "formatted": { 
    "weekday": "Thursday", 
    "month": "June", 
    "ago": "2 hours", 
    "calendar": "Today at 4:29 PM", 
    "generic": "2013-06-13T16:29:55+00:00", 
    "time": "4:29 PM", 
    "short": "06/13/2013", 
    "slim": "6/13/2013", 
    "hand": "Jun 13 2013", 
    "handTime": "Jun 13 2013 4:29 PM", 
    "longhand": "June 13 2013", 
    "longhandTime": "June 13 2013 4:29 PM", 
    "full": "Thursday, June 13 2013 4:29 PM", 
    "fullSlim": "Thu, Jun 13 2013 4:29 PM" 
}, 
    "array": [ 
    2013, 
    5, 
    13, 
    16, 
    29, 
    55, 
    245 
    ], 
"offset": 1371140995245, 
"unix": 1371140995, 
"utc": "2013-06-13T16:29:55.245Z", 
"valid": true, 
"integer": false, 
"zone": 0 
} 
Смежные вопросы