Javascript даты: кошмар - PullRequest
       3

Javascript даты: кошмар

0 голосов
/ 12 декабря 2018

Я понимаю, что работа с датами в любой среде может быть довольно запутанной, но я нахожусь в кошмаре с функцией, которая должна быть тривиальной работой.Я хочу по-разному манипулировать некоторыми датами, но получаю ошибки или неверные результаты.
Ниже я сообщаю очень простой пример, сделанный для проверки выполнения;цель здесь - получить дату начала текущего месяца, просто чтобы показать, что происходит:

function DateAdjust() {
var newdate   = new Date();         //1: 2018-12-12T21:00:20.099Z
newdate = newdate.setDate(1);       //2: 1543698020099
newdate=Date(newdate);                  //3: Wed Dec 12 2018 21:01:43 GMT+0000 (Ora standard dell’Europa occidentale)
var d = newdate.getDate();          //4: newdate.getDate is not a function

}

4 строки, 3 неожиданных результата (как показывает отладчик Firefox):
1. дата начала не имеет дня недели и часового пояса
2. при установке дня результат преобразуется в миллисекунды (почему?);Я не знаю, правильно ли это.
3. при преобразовании в строку указывается исходная дата, неизмененная (почему?), Но с указанием дня недели и часового пояса
4. при попытке получить значение дня выдается ошибка (почему?)

Мое окружение:
Win 7 32бит SP1
Firefox 63.0.3 (32 бита)
jquery-2.2.4.min.js

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

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Что касается строки 1, то Z в конце - это обозначение часового пояса для UTC в ISO 8601 (см. Wikipedia ).

Если время указано в UTC,добавить Z сразу после времени без пробела.Z - обозначение зоны для нулевого смещения UTC.Следовательно, «09:30 UTC» обозначается как «09: 30Z» или «0930Z».«14:45:15 UTC» будет «14: 45: 15Z» или «144515Z».

Относительно строки 2 см. Статью MDN по setDate (выделенная шахта):

Количество миллисекунд с 1 января 1970 года 00:00:00 UTC и заданная дата ( объект Date также изменяется на месте ).

Таким образом, вы можете увидеть «правильное» поведение, которое вы, вероятно, ожидаете, простоигнорируя возвращаемое значение:

var newdate = new Date(); //1: 2018-12-12T21:00:20.099Z
newdate.setDate(1);       //2: 1543698020099
console.log(newdate);     //3: 2018-12-01T21:00:20.099Z

Относительно строки 3 см. MDN статью о Date (выделено мной):

Примечание : объекты JavaScript Date могут быть созданы только путем вызова JavaScript Date в качестве конструктора: вызов его как обычной функции (т. Е. Без оператора new) вернет строку, а не Date объект ;в отличие от других типов объектов JavaScript, объекты JavaScript Date не имеют буквального синтаксиса.

Что касается строки 4, выше также объясняется эта ошибка, поскольку newdate теперь является строкой, а не Dateобъект.


Для чего это стоит, я согласен с другими комментаторами.Функции даты в JavaScript довольно беспорядочные по сравнению со многими другими современными языками.Я настоятельно рекомендую использовать такие библиотеки, как moment , luxon или date-fns .Это сделает вашу жизнь намного проще.

0 голосов
/ 13 декабря 2018
var newdate   = new Date();  // 1
console.log(typeof newdate, newdate); // object Wed Dec 12 2018 23:00:44 GMT+0200 (Eastern European Standard Time)
newdate = newdate.setDate(1); // 2    
console.log(typeof newdate, newdate); //number 1543698085383
newdate=Date(newdate);        //3       
console.log(typeof newdate, newdate);  //string Wed Dec 12 2018 23:04:44 GMT+0200 (Eastern European Standard Time)
var d = newdate.getDate();       // 4
console.log(typeof d, d); // 
  1. Тип даты назначен объекту.
  2. номер назначен newdate.который тикает
  3. возвращает строку
  4. string.getDate () не определена, поэтому не определена.

надеюсь, это поможет.

0 голосов
/ 12 декабря 2018

Я рекомендую использовать moment.js

Но с вашим кодом есть 2 проблемы:

1-

newdate = newdate.setDate(1);

setDate изменяет newDate на месте и возвращаетэто в миллисекундах, а не новый объект Date.Если вы просто хотите установить дату, сделайте это вместо:

newdate.setDate(1);

2-

newdate=Date(newdate);

Не совсем уверен, почему вы пытаетесь получить новый объект Date, но вам нужноновый, иначе это будет просто строка

newdate= new Date(newdate);

Исправление проблемы 1 должно устранить необходимость в коде проблемы 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...