Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как узнать есть ли в дате часовой пояс? (https://javascript.ru/forum/misc/64646-kak-uznat-est-li-v-date-chasovojj-poyas.html)

Shitbox2 26.08.2016 21:39

Как узнать есть ли в дате часовой пояс?
 
Дата задана строкой в ISO8601 или IETF RFC 2822 формате. Как узнать, что в ней указан часовой пояс, не парся строку?
var date1 = new Date('2000-01-05T23:59:59.000Z'); //UTC
var date2 = new Date('2000-01-05T23:59:59.000+03:00'); 

var date3 = new Date('Sat Jan 05 2000 23:59:59 GMT+0000 (MSK)'); //UTC
var date4 = new Date('Sat Jan 05 2000 23:59:59 GMT+0300 (MSK)');
var date5 = new Date('Sat Jan 05 2000 23:59:59'); //пользовательский пояс

console.log(date1, date2, date3, date4, date5)


А если без парсинга невозможно, то какими регулярками парсится?

nerv_ 27.08.2016 14:21

https://developer.mozilla.org/ru/doc...TimezoneOffset
?

рони 27.08.2016 14:28

nerv_,
и как это поможет?

laimas 27.08.2016 14:49

Цитата:

Сообщение от Rise
string.length > 24

это как? )

laimas 27.08.2016 15:03

Rise,
Sat, 25 Aug 2016 11:56:28 UTC - это формат UTC, возвращаемый методом toUTCString
Sat Aug 25 20:59:42 UTC+0540 2016 - дата/время возвращаемое методом toString
20:57:18 UTC+0300 - время возвращаемое методом toTimeString

А еще есть и ISO формат. И как больше/меньше/не равно 24?

laimas 27.08.2016 16:07

Цитата:

Сообщение от Rise
у ТС показан формат не надо выдумывать другие комбинации...

Дата - это понятие широкое, включающее в себя дату/время, которые имеют множество представлений. То что вы написали, это полная чепуха, а что вот такая строка и такая строка, не есть аргумент.

Aetae 27.08.2016 20:23

Проверять наличие плюсика?)
Сама по себе просто задача непонятная.

laimas 28.08.2016 00:42

Цитата:

Сообщение от Rise
что предлагаешь?

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

nerv_ 28.08.2016 12:57

Цитата:

Сообщение от рони
и как это поможет?

тогда, если я правильно понял вопрос, так:
let arr = [
  '2000-01-05T23:59:59.000Z',
  '2000-01-05T23:59:59.000-03:30',
  '2000-01-05T23:59:59.000+04:15',
  'Sat Jan 05 2000 23:59:59 GMT-0400',
  'Sat Jan 05 2000 23:59:59 GMT+0000',
  'Sat Jan 05 2000 23:59:59 GMT+0400',
  'Sat Jan 05 2000 23:59:59'
];

for(let str of arr) {
	console.log(getTimeZoneOffset(str));
}

/**
* @see [url]https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset[/url]
* @param {String} ds1 a date as string
* @returns {Number}
*/
function getTimeZoneOffset(ds1) {
  let isUTC = ds1.slice(-1) === 'Z';
  if (isUTC) {
  	return 0;
  }
  let ds2 = ds1.replace(/[-+]\d\d:?\d\d/, '');
  if (ds1 !== ds2) {
    let d1 = Date.parse(ds1);
  	let d2 = Date.parse(ds2);
    return (d2 - d1) / 1000 / 60;
  } else {
  	return new Date().getTimezoneOffset();
  }
}


UPD: http://momentjs.com/guides/#/lib-con...mezone-offset/

nerv_ 28.08.2016 13:14

Цитата:

Сообщение от laimas
если источник задающий это время подконтролен, то не допускать такой каши в представлении времени

это не каша, это стандарты представления времени

laimas 28.08.2016 13:26

Цитата:

Сообщение от nerv_
это не каша, это стандарты представления времени

Каша не в смысле напридумывали кучу, а отдавать в одном формате, а не в разнобой, в том случае если источник свой.

Shitbox2 29.08.2016 03:54

nerv_,
Цитата:

тогда, если я правильно понял вопрос, так: ... getTimeZoneOffset ...
Ну да, что-то типа того. Как понимаю, средствами языка смещение никак не вычислить. Только парсить.

laimas, в том-то и дело, что источник не свой. В общем виде, нужно написать функцию, сравнивающую две даты, которая будет принимать аргументы в пяти распространенных форматах: JS Date, time (кол-во мс с 1970), ISO8601, IETF RFC 2822 и moment.js date. Причем даты могут быть в разных форматах.

P.S. Вопрос на засыпку для извращенцев, что вернут выражения :-)
new Date(/14/)
new Date(/33/)

laimas 29.08.2016 07:50

Цитата:

Сообщение от Shitbox2
что вернут выражения

Invalid Date.

Цитата:

Сообщение от Shitbox2
нужно написать функцию, сравнивающую две даты, которая будет принимать аргументы в пяти распространенных форматах

Если бы речь шла об едином мгновении времени и времени конкретного клиента, то хватило бы Date.parse().

Разбирать рег. выражением учитывая все форматы. На сервере, к примеру в РНР есть готовая функция date_parse(), возвращающая всю информацию о заданной дате/времени. Например для таких форматов 2000-01-05T23:59:59.000Z, 2000-01-05T23:59:59.000+04:15, Sat Jan 05 2000 23:59:59 GMT-0400 будет возвращено соответсвенно:

Код:

Array
(
    [year] => 2000
    [month] => 1
    [day] => 5
    [hour] => 23
    [minute] => 59
    [second] => 59
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 2
    [zone] => 0
    [is_dst] =>
    [tz_abbr] => Z
)

Array
(
    [year] => 2000
    [month] => 1
    [day] => 5
    [hour] => 23
    [minute] => 59
    [second] => 59
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => -255
    [is_dst] =>
)

Array
(
    [year] => 2000
    [month] => 1
    [day] => 5
    [hour] => 23
    [minute] => 59
    [second] => 59
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => 240
    [is_dst] =>
    [relative] => Array
        (
            [year] => 0
            [month] => 0
            [day] => 0
            [hour] => 0
            [minute] => 0
            [second] => 0
            [weekday] => 6
        )

)


Shitbox2 29.08.2016 10:19

Цитата:

Invalid Date.
На 100% уверен?)

laimas 29.08.2016 12:30

Цитата:

Сообщение от Shitbox2
На 100% уверен?)

Как не извращенец да. Где изврат то? )

Что это такое - '\v'=='v', изврат или нет?

nerv_ 29.08.2016 12:42

Цитата:

Сообщение от Shitbox2
Как понимаю, средствами языка смещение никак не вычислить

А я как по твоему сделал?)

рони 29.08.2016 15:02

nerv_,
почему 'Sat Jan 05 2000 23:59:59' не ноль тогда?

Shitbox2 30.08.2016 17:13

Оказалось, можно и без смещения всё сделать) Написал конвертер для дат https://github.com/tamtakoe/common-v...y.js#L694-L730, который преобразует даты любых форматов в UTC-дату, после чего их можно нормально сравнивать.

Позже в отдельный проект вынесу

laimas 30.08.2016 17:58

Цитата:

Сообщение от Shitbox2
Написал конвертер для дат

А чем не устраивает тогда date_parse с strtotime?

Shitbox2 30.08.2016 20:00

Цитата:

А чем не устраивает тогда date_parse с strtotime?
Это так же глупо как использовать парсер для JSON, когда в JS есть встроенный :-) Тем более, не уверен, что эта библиотека будет нормально все ситуации обрабатывать. Она работает только со строками, тогда как половина сложностей была в сравнение моментовских дат и дат из таймстемпа

laimas 31.08.2016 03:17

Цитата:

Сообщение от Shitbox2
Она работает только со строками

А что кроме метки времени или его отдельно взятого компоненте есть не строка в его представлении?

Цитата:

Сообщение от Shitbox2
не уверен, что эта библиотека будет нормально все ситуации обрабатывать

Не могу утверждать об аналоге, хотя можно и проверить, но оригинальная strtotime обрабатывает английскую нотацию выражений о времени и ей по плечу куда более прозаическое, чем "UTC или не UTC?". )

Shitbox2 31.08.2016 11:14

Цитата:

А что кроме метки времени или его отдельно взятого компоненте есть не строка в его представлении?
Не понял вопрос
Цитата:

оригинальная strtotime обрабатывает английскую нотацию выражений о времени и ей по плечу куда более прозаическое, чем "UTC или не UTC?"
Вот это как раз, вообще, пофигу) Если пользователь юзает какую-то свою нотацию времени из каких-то непонятных стандартов, пусть сам с этим и мучается. А вот UTC, не UTC это реальная проблема JS. К сожалению, до конца ее не решить, т.к. реализация отличается в ES5, ES6, в браузерах и даже на разных машинах может по-разному работать

laimas 31.08.2016 12:47

Цитата:

Сообщение от Rise
timestamp который всегда UTC

С чего это вдруг?

laimas 31.08.2016 13:05

Цитата:

Сообщение от Shitbox2
Не понял вопрос

Что не понятного, представление времени это всегда строка, за исключением штампа времени и конкретно взятого его компонента, например год. А strtotime и работает со строковым представлением, возвращая штамп времени.

Цитата:

Сообщение от Shitbox2
Если пользователь юзает какую-то свою нотацию времени из каких-то непонятных стандартов

Ну это как сказать, по крайней мере проще написать:

$day = date('d', strtotime('first day next week'));


чем разводить бухгалтерию вычислений.

laimas 31.08.2016 14:10

Цитата:

Сообщение от Rise
а как иначе

Вы спутали системные часы и смещения часовых поясов. Системные часы и работают относительно Гринвича, достаточно указать другой часовой пояс системным часам и время изменится. Но время клиента, это локальное время. Например, если клиент получит время московского клиента как дата/время и дата/время/UTC, то на клиенте из этих дат будет возвращены метки времени - первая как локальное время клиента, а вторая с указанным смещением, и эти метки времени будут различны.

laimas 31.08.2016 15:53

Цитата:

Сообщение от Rise
суть была в том что дата/время должно храниться/передаваться в виде timestamp

Не обязательно timestamp, главное чтобы представление было одно, но как уже отвечал автор на подобное предложение - источник данных не подконтролен ему.

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

Shitbox2 06.09.2016 12:46

Выпустил модуль normalize-date. Приводит любую дату к нативной JS UTC (или эквивалентной UTC) дате.

Надеюсь, это избавит от проблем сравнения дат в 90% случаев


Часовой пояс GMT +3, время: 00:57.