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

  • Автор темы Автор темы semafor
  • Дата начала Дата начала

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Реакции
411
Баллы
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».

Как привести данные в переменных к типу понятному машине знаний не хвает. Буду признателен за подсказку!
 
Берете время коммента плюсуете 86 400 секунд в кубике Ява скрипт и потом сравнивает через кубик Иф если больше то работает с данными если нет то не работаете
 
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);
 
с отрезанной regex-ом дробной частью
В шарпе для обработки чисел не принято пользовать регексы :D

C#:
Развернуть Свернуть Копировать
string timeMy = "1487932553,11616";//исходня строка, пожно брать из переменной проект :)
double  dbl = Convert.ToDouble(timeMy); // Конвертируем исходную строку в число с плавающей запятой
long loong = (long)Convert.ToInt64(dbl);// конвертируем число с запятой в лонг
project.SendInfoToLog( loong.ToString(), true);;//выводим результат
 
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. А где наша дата?
 
Так ты возвращай ее
return loong.ToString();// это в конец кода добавь
ZHAG, да мне не нужны даты в обычном представлении, меня unixtime устраивает ))
Так в том то и дело, что unixtime это так сказать строковое предстовление объекта DataTime, ну а чтобы тебе высчитать разность дат и выяснить вхождение тебе нужно будет приводить строку к формату DateTime.
ну или строку приводить к типу Long потом высчитывать разность и вхождение. но это не савсем корректо, тыж с датой работаешь :)
 
Так в том то и дело, что unixtime это так сказать строковое предстовление объекта DataTime, ну а чтобы тебе высчитать разность дат и выяснить вхождение тебе нужно будет приводить строку к формату DateTime.
ну или строку приводить к типу Long потом высчитывать разность и вхождение. но это не савсем корректо, тыж с датой работаешь :-)
Я уже что-то начал подозревать, правда пока неявно :-) Т.к. добиться корректного результата без DataTime не смог. Просто изначально казалось - нафига козе боян - взял timestamp-ы заминусовал сравнил с 86400 и в шоколаде. А потом что-то пошло не так ))) Завтра продолжу эксперименты
 
@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
Спасибо! Отпишусь когда опробую
 
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-}
 
Последнее редактирование:
Вчера сгоряча понаклепал в шаблоне, сегодня пришлось все перелопатить...

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

Код:
Развернуть Свернуть Копировать
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
А вот еще вопрос вдогонку - а есть возможность при конвертации из unixtime получать время с учетом часового пояса локальной машины?
 
А вот еще вопрос вдогонку - а есть возможность при конвертации из unixtime получать время с учетом часового пояса локальной машины?
Только прибавлять разницу.
Можно определить часовой пояс текущей машины, и потом прибавлять разницу во время конвертации. Других вариантов не знаю.
 
Я был не прав :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
О!!! Спасибо!
 
))) И еще один вопросик — я очень любознателен :-) —

Код:
Развернуть Свернуть Копировать
{-Variable.DateComment-} + {-Variable.TimeDiff-} > {-TimeNow.UnixTime-}

такая конструкция должна работать? А то у меня не захотела почему-то..
 
Все работает. {-Variable.TimeDiff-} вот сюда что передаешь? нужно передавать количество секунд вхождения которое тебе интересно.
 
Все работает. {-Variable.TimeDiff-} вот сюда что передаешь? нужно передавать количество секунд вхождения которое тебе интересно.

Именно так и делал. Сейчас еще раз попробую — кривизна рук и мыльный глаз могли сыграть злую шутку. ))

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

А в регулярки переменные можно подставлять?
Можно
 
  • Оценить
Реакции: semafor
так вот, для работы с json в зеннке имеется встроенный функционал.

Блин, ZHAG, умеешь ты глаза открывать человеку! Пошел курить маны)))
 
Ремарка:
Код:
Развернуть Свернуть Копировать
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

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