2016-11-23 2 views
3

Я просто пытаюсь преобразовать временную метку обратно в человекообразную дату, но то, что я получаю при обращении, странно и неправильно.Javascript: Преобразуйте временную метку в понятную человеку дату?

Это, как я сохранить метку времени:

var timestamp = Number(new Date()); 
localStorag.setItem("mytimestamp", timestamp); 

и это, как я получить его обратно и преобразовать его в читаемом дата:

var mydate = localStorag.getItem("mytimestamp"); 
var jsDate = new Date(mydate*1000); 

alert(jsDate); 

jsDate это неправильно, и я не понять, что вызывает это!

Не могли бы вы посоветовать это?

ответ

6

Чтобы решить проблему просто не умножьте его на 1000.

Это работает для меня.

var a = Number(new Date()) // 1479895361931

Тогда

date = new Date(a) // Ср 23 ноября 2016 18:03:25 GMT + 0800 (WITA)

Я получил правильное время.

2

Пробуйте использовать moment.js. Он добавить функции, такие как

moment().format('MMMM Do YYYY, h:mm:ss a'); // November 23rd 2016, 12:03:36 pm 
moment().format('dddd');     // Wednesday 
moment().format("MMM Do YY");    // Nov 23rd 16 
moment().format('YYYY [escaped] YYYY');  // 2016 escaped 2016 
moment().format();       // 2016-11-23T12:03:36+02:00 
+3

Я предпочитаю не использовать другие плагины, если честно .. его такая простая и простая задача, поэтому я бы предпочел не использовать какие-либо другие плагины. –

+0

Добавление библиотеки только для этого конкретного случая является чрезмерным ИМО. Это то, что можно сделать с помощью родной JS, если вам не нужен очень определенный формат времени. – Lix

+1

Вы, ребята, вероятно, правы. Другая библиотека, вероятно, слишком переполнена. Но это просто еще один вариант, и, как правило, при попытке манипулировать датами и временем вы быстро используете эту библиотеку. – omer727

4

Причиной этого вопроса здесь, когда вы умножаете метку времени на 1000.

Если вы просто передать myDate в Date конструктор, вы должны получить правильное время -

var timestamp = Number(new Date()); 
localStorage.setItem("mytimestamp", timestamp); 
// ... 
var mydateStr = localStorage.getItem("mytimestamp"); 
var myDate = Number(mydateStr); // convert the string back to a number 
var jsDate = new Date(mydate); 

Это правда, что Javascript имеет дело с миллисекундами, но поскольку вы генерируете метку времени с помощью Javascript, а затем читаете ее обратно с помощью Javascript, конверсия не требуется - вы можете использовать значение as-is.


Как было указано мне @manish в комментариях, значение, хранящееся в LocalStorage будет строка - не забудьте преобразовать его обратно в ряд, прежде чем передать его в конструктор Date.

+1

это вернет недопустимую дату https://jsfiddle.net/xdkon614/. Посмотрите – Manish

+0

Спасибо @Manish! Вы действительно правы! Фиксировать мой пост сейчас – Lix

+1

Добро пожаловать. Причина этого я объяснил в своем ответе. – Manish

1
var yourTimestamp = localStorag.getItem("mytimestamp"); 
jsDate = new Date(yourTimestamp); 

jsDateValues = [ 
    jsDate.getFullYear(), 
    jsDate.getMonth()+1, 
    jsDate.getDate(), 
    jsDate.getHours(), 
    jsDate.getMinutes(), 
    jsDate.getSeconds(), 
]; 
alert(jsDateValues); //=> [2011, 3, 25, 23, 0, 0] 

, и вы можете использовать значения baove и печати, в каком формате вы wnat например дд/мм/гггг

+0

Этот код будет страдать от той же проблемы, поскольку вы все равно умножаете миллисекундное значение на 1000. 'localStorag.getItem (« mytimestamp »);' хранит метку времени уже в миллисекундах. – Lix

+0

умножьте с 1000, сделайте отметку времени неправильной. – Natsathorn

+0

Да ваше право, i thoght значение, которое я получаю, в миллисекундах. – Tanveer

1

Проблема здесь состоит в том, что, когда вы храните что-то в LocalStorage его хранится в виде строки '1479895747557' и не число So, когда вы получаете временную метку обратно из localstorage, это не номер, а строка. Хотя, когда вы умножаете его, значение фактически изменяется из-за внутреннего преобразования, оно становится 1479895747557000, и это представляет другую дату с той, которую вы сохранили. Таким образом, решение было бы преобразовать строку обратно в число. Вот код, который отлично работает.

var timestamp = Number(new Date()); 
 
localStorage.setItem("mytimestamp", timestamp); 
 
var mydate = localStorage.getItem("mytimestamp"); 
 
var jsDate = new Date(Number(mydate)); 
 
alert(jsDate);

Вот код, который не выполняет преобразование обратно на номер, это даст вам неверную дату.

var timestamp = Number(new Date()); 
 
localStorage.setItem("mytimestamp", timestamp); 
 

 
var mydate = localStorage.getItem("mytimestamp"); 
 

 
var jsDate = new Date(mydate); 
 

 
alert(jsDate);

FIDDLE

1

Вот простое решение, которое работает для меня:

const date = new Date(timestamp).toDateString(); 
alert(date); 

напечатает что-то вроде: Чт Июл 14 2016

Смежные вопросы