Сравнение двух дат в Unixtime

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Добрый день!
Есть две переменные с датами в формате unixtime. Одна спаршена из ВК (дата комента), вторая текущее системное время {-TimeNow.UnixTime-} с отрезанной regex-ом дробной частью. Нужно выбрать коменты, оставленные не позднее чем сутки назад.

Нашел в ветке http://zennolab.com/discussion/threads/kak-sravnit-datu-v-proekte.17446/ вот такое решение по сравнению дат:

Код:
DateTime date = Convert.ToDateTime(project.Variables["var1"].Value);
DateTime date1 = Convert.ToDateTime(project.Variables["var1"].Value);
TimeSpan diff = date1 - date;
return Math.Floor(diff.TotalSeconds);

И меня бы вполне устроил возвращаемый выражением результат, но при выполнении выходит ошибка: «Строка не распознана как действительное значение DataTime».

Как привести данные в переменных к типу понятному машине знаний не хвает. Буду признателен за подсказку!
 

Deniska

Client
Регистрация
20.07.2016
Сообщения
82
Благодарностей
5
Баллы
8
Берете время коммента плюсуете 86 400 секунд в кубике Ява скрипт и потом сравнивает через кубик Иф если больше то работает с данными если нет то не работаете
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
C#:
//Получаем текущее время в unix формате и переводим в тип стринг
// т.е.получаем исходные данные в твоем примере
var unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;//1487931203
string stringTimeInput = unixTime.ToString();
project.SendInfoToLog(stringTimeInput, true);
//


// Строковое выражение даты приводим в формат времени
// Сначала Нам нужно перевести в тип long входную строку
long UTlong = Convert.ToInt64(stringTimeInput);
// Ну а теперь получаем дату время в понятном нам виде
DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(UTlong);
project.SendInfoToLog(pDate.ToString(), true);

//Еще для общего образования можешь побаловаться так
project.SendInfoToLog(pDate.ToString("yyyy-MM-dd"), true);
project.SendInfoToLog(pDate.ToString("dd/MM/yy"), true);
project.SendInfoToLog(pDate.ToString("yyMMdd"), true);
project.SendInfoToLog(pDate.ToString("dd.MM.yyyy"), true);
project.SendInfoToLog(pDate.ToString("s"), true);
project.SendInfoToLog(pDate.ToString("g"), true);
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
с отрезанной regex-ом дробной частью
В шарпе для обработки чисел не принято пользовать регексы :D

C#:
string timeMy = "1487932553,11616";//исходня строка, пожно брать из переменной проект :)
double  dbl = Convert.ToDouble(timeMy); // Конвертируем исходную строку в число с плавающей запятой
long loong = (long)Convert.ToInt64(dbl);// конвертируем число с запятой в лонг
project.SendInfoToLog( loong.ToString(), true);;//выводим результат
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Deniska, пробовал делать так - в яваскрипте отнимал от текущего времени время комента и сравнивал результат с 86400. Но список для коментов остается пустым. взял сделал список чтобы посмотреть на разность, а там ни одного значения меньше 180000, хотя есть совсем свежие коменты. Поэтому и задумался.

ZHAG, да мне не нужны даты в обычном представлении, меня unixtime устраивает ))
В шарпе для обработки чисел не принято пользовать регексы :D
А я стандартным экшеном полировал до C# ( ведь насколько я понимаю {-TimeNow.UnixTime-} возвращает string), но спасибо за информацию - на будущее. После выполнения
Код:
string timeMy = "1487932553,11616";//исходня строка, пожно брать из переменной проект :)
double  dbl = Convert.ToDouble(timeMy); // Конвертируем исходную строку в число с плавающей запятой
long loong = (long)Convert.ToInt64(dbl);// конвертируем число с запятой в лонг
project.SendInfoToLog( loong.ToString(), true);;//выводим результат
переменная в которую я пишу результат принимает значение: ok. А где наша дата?
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
Так ты возвращай ее
return loong.ToString();// это в конец кода добавь
ZHAG, да мне не нужны даты в обычном представлении, меня unixtime устраивает ))
Так в том то и дело, что unixtime это так сказать строковое предстовление объекта DataTime, ну а чтобы тебе высчитать разность дат и выяснить вхождение тебе нужно будет приводить строку к формату DateTime.
ну или строку приводить к типу Long потом высчитывать разность и вхождение. но это не савсем корректо, тыж с датой работаешь :-)
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Так в том то и дело, что unixtime это так сказать строковое предстовление объекта DataTime, ну а чтобы тебе высчитать разность дат и выяснить вхождение тебе нужно будет приводить строку к формату DateTime.
ну или строку приводить к типу Long потом высчитывать разность и вхождение. но это не савсем корректо, тыж с датой работаешь :-)
Я уже что-то начал подозревать, правда пока неявно :-) Т.к. добиться корректного результата без DataTime не смог. Просто изначально казалось - нафига козе боян - взял timestamp-ы заминусовал сравнил с 86400 и в шоколаде. А потом что-то пошло не так ))) Завтра продолжу эксперименты
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
@semafor
Решил я размять свои кости на дефолтовых задачках. Держи готовый сниппет:
C#:
var dateVKKomment = project.Variables["DateKomment"].Value; // передаем в снипет дату комента в юникс формате

double  dbl = Convert.ToDouble(dateVKKomment); // Конвертируем исходную строку в число с плавающей запятой
long loong = Convert.ToInt64(dbl);// конвертируем число с запятой в лонг тем самым убираем дробную часть

DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(loong);//наконец преобразуем дату коммента в тип DateTime

if(pDate.AddHours(24) >= DateTime.Now){
    // если прибавив к дате комента 24 часа  мы получили дату больше текущей тогда выходим оп зеленой ветке
    return "ok";
}
else{
    //если прибавив 24 часа мы получили значение меньше тогда этот комент нам не подходит
    return null;
}
 
  • Спасибо
Реакции: semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Спасибо! Отпишусь когда опробую
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
C#:
long dateComment = long.Parse(project.Variables["DateComment"].Value); // дата коммента в UnixTime
long dateNow = DateTimeOffset.Now.ToUnixTimeSeconds(); // текущая дата в UnixTime
if (dateComment + 86400 <= dateNow) return null; // если дата коммента больше 24 часов назад, то выход по неуспеху
То же самое одним кубиком If
Код:
{-Variable.DateComment-} + 86400 > {-TimeNow.UnixTime-}
 
Последнее редактирование:

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Вчера сгоряча понаклепал в шаблоне, сегодня пришлось все перелопатить...

Решил я размять свои кости на дефолтовых задачках. Держи готовый сниппет:

Код:
var dateVKKomment = project.Variables["DateKomment"].Value; // передаем в снипет дату комента в юникс формате

double  dbl = Convert.ToDouble(dateVKKomment); // Конвертируем исходную строку в число с плавающей запятой
long loong = Convert.ToInt64(dbl);// конвертируем число с запятой в лонг тем самым убираем дробную часть

DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(loong);//наконец преобразуем дату коммента в тип DateTime

if(pDate.AddHours(24) >= DateTime.Now){
    // если прибавив к дате комента 24 часа  мы получили дату больше текущей тогда выходим оп зеленой ветке
    return "ok";
}
else{
    //если прибавив 24 часа мы получили значение меньше тогда этот комент нам не подходит
    return null;
}
ZHAG, спасибо за сниппет — он полностью рабочий! И за направление мысли тоже )))

Dimionix, круто!
Код:
{-Variable.DateComment-} + 86400 > {-TimeNow.UnixTime-}
Изящно получилось!
 
  • Спасибо
Реакции: Dimionix

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
А вот еще вопрос вдогонку - а есть возможность при конвертации из unixtime получать время с учетом часового пояса локальной машины?
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
А вот еще вопрос вдогонку - а есть возможность при конвертации из unixtime получать время с учетом часового пояса локальной машины?
Только прибавлять разницу.
Можно определить часовой пояс текущей машины, и потом прибавлять разницу во время конвертации. Других вариантов не знаю.
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
Я был не прав :D:D:D

C#:
DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(1487932553);
DateTime dt = DateTime.Now;//Текущее время локальной машины в часовом поясе TimeZoneInfo.Local.Id
DateTime ldt = System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(pDate,TimeZoneInfo.Local.Id);//конвертировать значение объекта DateTime в локальное время
return ldt;
 
  • Спасибо
Реакции: semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
О!!! Спасибо!
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
))) И еще один вопросик — я очень любознателен :-)

Код:
{-Variable.DateComment-} + {-Variable.TimeDiff-} > {-TimeNow.UnixTime-}
такая конструкция должна работать? А то у меня не захотела почему-то..
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
Все работает. {-Variable.TimeDiff-} вот сюда что передаешь? нужно передавать количество секунд вхождения которое тебе интересно.
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Все работает. {-Variable.TimeDiff-} вот сюда что передаешь? нужно передавать количество секунд вхождения которое тебе интересно.
Именно так и делал. Сейчас еще раз попробую — кривизна рук и мыльный глаз могли сыграть злую шутку. ))

А в регулярки переменные можно подставлять? Например нужно выполнить какое то действие в списке со строкой соответствующей такой конструкции \{"id":\d{3,},"from_id":{-Variable.SomeID-}.*?}
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
\{"id":\d{3,},"from_id":{-Variable.SomeID-}.*?}
судя по конструкции твоей регулярки, ты пытаешься парсить json. так вот, для работы с json в зеннке имеется встроенный функционал. А если юзаешь C# то там его лучше серилизовать.

А в регулярки переменные можно подставлять?
Можно
 
  • Спасибо
Реакции: semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
так вот, для работы с json в зеннке имеется встроенный функционал.
Блин, ZHAG, умеешь ты глаза открывать человеку! Пошел курить маны)))
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
404
Баллы
63
Ремарка:
Код:
DateTime pDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(1487932553);
DateTime dt = DateTime.Now;//Текущее время локальной машины в часовом поясе TimeZoneInfo.Local.Id
DateTime ldt = System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(pDate,TimeZoneInfo.Local.Id);//конвертировать значение объекта DateTime в локальное время
return ldt;
не возвращает дату с учетом локального времени, т.к. в System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(pDate,TimeZoneInfo.Local.Id) не хватает указания исходного часового пояса.
Правильная конструкция выглядит так (для конвертации из UTC в Local):

System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(pDate,TimeZoneInfo.Utc,TimeZoneInfo.Local.Id)
 
  • Спасибо
Реакции: ZHAG

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)