Страницы

воскресенье, 14 сентября 2014 г.

JavaScript Date toUTCString vs. toString

Не знаю какого коллайдера мне вздумалось реализовать возможность принимать в GET запросе параметр, содержащий дату в виде строки, хватило бы и unix time stamp, но на решение этого совсем необязательного вопроса я потратил гораздо больше времени чем планировал. В общем история очередного фэйла.

Для того, чтобы по-быстрому воспроизвести ситуацию предлагаю использовать express-generator.

После создания "стандартного" приложения на фреймворке Express с помощью express-generator (инструкция) подредактируем код файла app.js - сразу после "статики" и перед "маршрутами" добавим middleware для вывода в консоль данных, необходимых для понимания сути вопроса:
...
app.use(express.static(path.join(__dirname, 'public')));

app.use(function(req, res, next) {
  var date = req.query.date || req.body.date, 
      timestamp = Date.parse(date),
      fromTimestamp = new Date(timestamp);
  console.log('req.method: %s\ndate: %s\ntimestamp: %s\nfromTimestamp: %s\n', req.method, date, timestamp, fromTimestamp);    
  next();
});

app.use('/', routes);
...

Получим текущую дату и приведем ее к UTCString, я сделаю это в Node.js REPL:

Запускаем приложение.
Пока мы отправляем запросы с помощью cURL все идет как надо:
curl -X POST -H "Content-Type: application/json" -d '{"date": "Sun Sep 14 2014 09:55:54 GMT+0400 (Московское время (зима))"}' http://localhost:3000
curl -X GET http://localhost:3000 --data-urlencode "date=Sun Sep 14 2014 09:55:54 GMT+0400 (Московское время (зима))"

Но если попытаться воткнуть дату в адресную строку браузера, получаем не совсем то, что ожидаем:
- http://localhost:3000/?date=Sun Sep 14 2014 09:55:54 GMT+0400 (Московское время (зима))

А если привести дату к UTCString, то все норм:
http://localhost:3000/?date=Sun, 14 Sep 2014 05:55:54 GMT

А теперь внимание, вопрос: найди три отличия на этих рисунках :).