Re[2]: Локализация дат и в распределенных приложениях
От: baranovda Российская Империя  
Дата: 25.03.15 06:57
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Я честно говоря не понимаю твою проблему...

CS>Мне кажется ты как-то неправильно это все интерпретируешь.
CS>То как ты кодируешь дату или время при JSON передаче абсолютно не релевантно. Это функция твоего контроллера который стоит между моделью данных и view.

Попробую на пальцах

  Пример (рядом нужно положить plus.tis и plus.css):
<html>
<head>
<style>
@import url(plus.css);
</style>
<script type="text/tiscript">
  include "plus.tis";
  
  var Model = {
    date: new Date();
  }
  
  function self#test1.onClick()
  {  
     view.msgbox(#alert, self#date.value);
  }
  
  function self#test2.onClick()
  {  
     view.msgbox(#alert, String.printf("%v", Model));
  }
  
  function self#test3.onClick()
  {  
     var d = new Date("2015-03-24T21:00:00");
     view.msgbox(#alert, Date.timeZoneOffset());
     d.millisecond += Date.timeZoneOffset();
     view.msgbox(#alert, d.toLocaleString());
     Model.date = d;
  }

</script>
</head>
<body>
  <form model="Model">
    Case date: <input type="date" name="date" id="date" />
  </form>
  
  <div model="Model">
    Date: <output name="date" type="date"/> Time: <output name="date" type="time"/>
  </div>
  
  <button id="test1">Show control date</button>
  <button id="test2">Show JSON</button>
  <button id="test3">Set date</button>
</body>
</html>


a) Ввожу дату — 25.03.2015
б) На сервер приходит 2015-03-25T21:00:00 (UTC). Я эту дату сохраняю в базу
в) Теперь клиент перезапрашивает данные и мне нужно эту дату отрисовать например в <table>.
в.1) Сервер отдает дату, хранящуюся в базе данных as is. Выполним в Sciter self#date.value = new Date("2015-03-24T21:00:00"). В datepicker-е рисуется 24.03.2015
в.2) Сервер должен отдать клиенту дату с учетом клиентской TimeZone. Но откуда он ее в общем случае знает?
в.3) Клиентский контроллер должен сам интерпретировать полученное от сервера значение с учетом TimeZone клиентской рабочей станции: var d = new Date("2015-03-24T21:00:00"); d.millisecond += Date.timeZoneOffset();

В пункте в.3) и заключается весь геморрой, связанный с тем, что нужно везде и всюду держать в уме смещение.

Если выполнить в sciter мой пример, то проблема видна более выпукло. Три элемента прибайндены к одному и тому же полю модели, при этом видно, что date я выбираю 25.03.2015, а в output-ах рисуется 24.03.2015 21:00

CS>JSON не специфицирует никак даты — т.е. это сугубо твой бизнес. Приведи свои форматы дат к Date (UTC) при отправке и получении JSON от сервера и проблемы нет.

CS>И в общем случае сервер обязан хранить даты событий в UTC.

ИМХО это диктуется бизнес-логикой. Взять ту же дату рождения человека — важный учетный и статистический показатель, UTC в данном случае вообще не нужно, а если клиент будет сам даты приводить к UTC — то даже вредно. В самом деле, человек родился 1 января 1960, а в базу ляжет 31 декабря 1959, и человек вылетит из статистики за 1960-й год
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.