Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > таймстамп через день смены зимнего/летнего времени


Автор: z006 25.1.2020, 04:47
собственно вопрос в чём:как узнать в какой день меняется время на летнее/зимнее,и соответственно в какую сторону меняется?
мне к примеру нужно считать кол-во секунд между 25 января и 31 марта 2020.сейчас из-за перехода на летнее время мне говорит что в этом промежутке 65.95833333333333 дней  smile 
если использовать спецификатор часового пояса Date.parse(jQuery.datepicker.formatDate('mm/dd/yy', jQuery('#releasedatemod').datepicker('getDate'))+' '+jQuery('#releaseh').val()+':'+jQuery('#releasem').val()+':00 GMT+0200')
то для крайнего числа,31 марта,я получу значение 1585605600 секунд,что будет равняться часу ночи,а мне нужно ровно полночь.но по 29 марта включительно спецификатор работает правильно.
короче как научить код правильно понимать эти различия?

Автор: _zorn_ 25.1.2020, 10:29
Timestamp is time zone agnostic )

А если по русски - timestamp количество секунд прошедшее с 1970-01-01 00:00:00 в таймзоне UTC

Функции в браузере зависят от браузера и системы в которой он запущен. 
Короче со временем лучше работать на сервере.

Автор: z006 25.1.2020, 15:21
вот такая штука.нужно обсчитывать количество дней и соответственно цену,чтоб показывать пользователю.если время возврата отличается более чем на 2 часа от времени аренды-добавлять сутки.оно всё работает,но я столкнулся с темой перевода времени,и не знаю как обойти теперь.

https://fastpic.ru/view/111/2020/0125/567cb3705157eb2fe68ee6ae6fc0525d.jpg.html

а про часовой пояс-я ж могу явно указать нужный пояс,только вот как его корректировать с летним/зимним временем?

Автор: ksnk 26.1.2020, 01:20
Действуй по "формальной логике" - 
у тебя есть $starttime, вычисляешь $bordertime= strtotime('+1 day 2 hour',$starttime). C ним сравниваешь таймстамп возврата. И никакого твоего ума не требуется для расчета перевода времени.
Хотя такие вопросы тебе в бухгалтерии нужно выяснять - как они должны считаться на самом деле. 
Более "справедливым" вариантом было бы при сокращении времени аренды за счет перевода времени - продлевать срок аренды формально на час, а при добавлении - обходится формальным временем возврата. Это будет значить, что нужно еще и разницу таймстампов посчитать, если она меньше 60*60*24 + 2*60*60, то докидывать час...

Автор: z006 26.1.2020, 02:59
Цитата

у тебя есть $starttime, вычисляешь $bordertime= strtotime('+1 day 2 hour',$starttime).


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

Цитата

Более "справедливым" вариантом было бы при сокращении времени аренды за счет перевода времени - продлевать срок аренды формально на час, а при добавлении - обходится формальным временем возврата.


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

Автор: ksnk 26.1.2020, 16:10
Сорри, Не обратил внимания, что тема про Javascript smile 

В формочке есть дата, час и минута для каждой записи о заборе и возврате?

Код

        let
            dates=[
                [{date:'02/28/2010', hour:1, minutes:0},{date:'05/02/2010', hour:3, minutes:0}],
                [{date:'08/29/2010', hour:1, minutes:0},{date:'11/02/2010', hour:3, minutes:0}],
                [{date:'01/29/2010', hour:1, minutes:0},{date:'02/02/2010', hour:3, minutes:0}]
            ];

        dates.forEach((x)=>{
            let start=x[0], finish=x[1], fullday=24*60*60*1000,
                startdate=(new Date(start.date+' '+start.hour+':'+start.minutes)).getTime(),
                finishdate=(new Date(finish.date+' '+(finish.hour)+':'+finish.minutes)).getTime(),
                boundmod=(finish.hour*60+finish.minutes-60*start.hour-start.minutes)*60*1000,
                realmod=(finishdate-startdate)%(fullday);
                if(boundmod<0)boundmod+=fullday;

            if (realmod===boundmod)
                console.log('нет смены времени');
            else if (realmod<boundmod)
                console.log('на час меньше');
            else
                console.log('на час больше');
        });

2010 год, так как у нас с 11 года такой фигней больше не занимаются.

Основной смысл - считаем остаток от целого дня, который получается при вычитании таймстампов по стартовому-финишному времени и остаток от дня, который получится, если переводе нет

Автор: z006 27.1.2020, 17:55
Код

boundmod=(finish.hour*60+finish.minutes-60*start.hour-start.minutes)*60*1000,


как-то не похоже на мой вариант.у меня время возврата не обязательно будет равно или больше времени забора в суточном измерении.машину могут взять,к примеру.28.01 13:00 а вернуть 30.01 09:45.а могут и 15.02 18:15
вариантов масса.

Автор: ksnk 27.1.2020, 18:06
Там еще одна строка под под этой. Специально для коррекции нетакого времени

Автор: z006 28.1.2020, 20:31
Код

fullday=24*60*60*1000;
startdate=parseInt(Date.parse(jQuery.datepicker.formatDate('mm/dd/yy', jQuery('#pickupdatemod').datepicker('getDate'))+' '+jQuery('#pickuph').val()+':'+jQuery('#pickupm').val()+':00 GMT+0200'));
finishdate=parseInt(Date.parse(jQuery.datepicker.formatDate('mm/dd/yy', jQuery('#releasedatemod').datepicker('getDate'))+' '+jQuery('#releaseh').val()+':'+jQuery('#releasem').val()+':00 GMT+0200'));
boundmod=(jQuery('#releaseh').val()*60+jQuery('#releasem').val()-60*jQuery('#pickuph').val()-jQuery('#pickupm').val())*60*1000;
realmod=(finishdate-startdate)%(fullday);
if(boundmod<0)boundmod+=fullday;
if (realmod===boundmod)
                console.log('нет смены времени');
            else if (realmod<boundmod)
                console.log('на час меньше');
            else
                console.log('на час больше');


Код

нет смены времени
1585432800|1580162400
61


нет смены времени
1585515600|1580162400
61.958333333333336


нет смены времени
1585602000|1580162400
62.958333333333336


c 28.01 по 29,30 и 31 марта соответсвенно



видимо самое просто решение это Math.round

Автор: _zorn_ 30.1.2020, 22:22
О чем вы вообще мля ? 
ВРЕМЯ В БРАУЗЕ зависит от БРАУЗЕРА (сюрприз). Если укажешь что ты из голивуда, браузер поверит.

Автор: ksnk 1.2.2020, 11:54
_zorn_, Это калькулятор на сайте. Пользователь, конечно, может открыть сайт и из Голливуда, но точка аренды находится во вполне определенном месте и время взятия-возврата машины указанное в первой форме ввода даты - локальное время этой точки. 
Так что автору таки придется прикручивать локаль точки аренды, если ему надо, чтобы сайт работал адекватно по всему миру. Хотя расчитывать на правильно поставленную локаль по всем компьютерам по всему миру - imho самонадеянно... Или отправлять расчетку на сервер, что решит проблемы с переводом часов туда-сюда-обратно при заказе аренды из Австралии...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)