перевод строки в time
-
Задача отлавливать подвисшие CLI php скрипты работающих на Win2003.
Process.CPUTime не подошел - если скрипт подвис и ничего не делает, то возвращаются значения 0.
Решил попробовать черезWMI.Query(root\CIMV2,\"select * FROM Win32_Process WHERE Name = 'php.exe'\", CreationDate)Столкнулся с проблемой как сконвертировать значения этого запроса в объект time чтобы потом просчитать количество секунд которое прошло с начала старта? Значения приходят в виде 20160101235959.123123
Пробовал парсить как строку
rawdatetime = string($1); tm_datetime = localtime(); tm_datetime<-year = int32(substr(rawdatetime,1,4)); tm_datetime<-mon = int32(substr(rawdatetime,5,2)); tm_datetime<-mday = int32(substr(rawdatetime,7,2)); tm_datetime<-hour = int32(substr(rawdatetime,9,2)); tm_datetime<-min = int32(substr(rawdatetime,11,2)); tm_datetime<-sec = int32(substr(rawdatetime,13,2));но ругается на
Error 4 in line 3: Bad arithmetic conversion -
Одна из проблем в синтаксисе:
tm_datetime<-year = int32(substr(rawdatetime,1,4));
должно быть
tm_datetime->year = int32(substr(rawdatetime,1,4));
Но основная проблема – в nxsl сейчас нет поддержки функции mktime.
-
@alk said in перевод строки в time:
Одна из проблем в синтаксисе:
tm_datetime<-year = int32(substr(rawdatetime,1,4));
должно быть
tm_datetime->year = int32(substr(rawdatetime,1,4));
Так тоже ругался
Error 15 in line 3: Unknown object's attribute@alk said in перевод строки в time:
Но основная проблема – в nxsl сейчас нет поддержки функции mktime.
точно, получается тогда пока никак.

-
ну почему... можно руками вычислять. В одном из проектов тоже не было возможности работать со временем, ноо нужно было высчитывать промежуток между запусками, в минутах. Выкрутились таким вот вычислением:
LastRunMin+(LastRunHour*60)+(LastRunDay*LastRunHour*60)+(LastRunMon*LastRunDay*LastRunHour*60)+(LastRunYear*LastRunMon*LastRunDay*LastRunHour*60)тут учтены переходы между днями, месяцами и годами.
да, это не timestamp.. это по сути вообще ничего
но т.к. нужна была просто дельта по времени, этого вполне хватило. -
А как при такой формуле определить делту в минутах?
Чего-то у меня значения дельты получаются не верны.
Скрипт такойrawdatetime = string($1); if(length(rawdatetime) >= 14) { starttime_year = format(substr(rawdatetime,1,4),1,0); starttime_mon = format(substr(rawdatetime,5,2),1,0); starttime_mday = format(substr(rawdatetime,7,2),1,0); starttime_hour = format(substr(rawdatetime,9,2),1,0); starttime_min = format(substr(rawdatetime,11,2),1,0); trace(0,"PHP start time is " . starttime_year . "-" . string(starttime_mon) . "-" . starttime_mday . " " . starttime_hour . ":" . starttime_min); starttime_ts = starttime_min+(starttime_hour*60)+(starttime_mday*starttime_hour*60)+(starttime_mon*starttime_mday*starttime_hour*60)+(starttime_year*starttime_mon*starttime_mday*starttime_hour*60); trace(0,"starttime_ts is " . starttime_ts); now = localtime(); now_year = now->year; now_mon = now->mon+1; now_mday = now->mday; now_hour = now->hour; now_min = now->min; trace(0,"Now time is " . now_year . "-" . now_mon . "-" . now_mday . " " . now_hour . ":" . now_min); now_ts = now_min+(now_hour*60)+(now_mday*now_hour*60)+(now_mon*now_mday*now_hour*60)+(now_year*now_mon*now_mday*now_hour*60); trace(0,"now_ts is " . now_ts); delta_min = now_ts - starttime_ts; trace(0,"delta_min is " . delta_min); return delta_min; } return false;Результат:
[03-Jan-2016 12:52:39.587] [INFO ] PHP start time is 2016-1-3 10:30 [03-Jan-2016 12:52:39.587] [INFO ] starttime_ts is 3633030 [03-Jan-2016 12:52:39.587] [INFO ] Now time is 2016-1-3 12:52 [03-Jan-2016 12:52:39.587] [INFO ] now_ts is 4359652 [03-Jan-2016 12:52:39.587] [INFO ] delta_min is 726622Или это абстрактная величина, которая будет едина для интервала? К примеру мне нужно генерить эвент когда дельта больше 60 реальных минут.
-
-
Да, ступил я. В общем смотри:
LastRunTimestamp = LastRunMin+(LastRunHour*60)+(LastRunDay*LastRunHour*60)+(LastRunMon*LastRunDay*LastRunHour*60)+(LastRunYear*LastRunMon*LastRunDay*LastRunHour*60) CurrRunTimestamp = CurrMin+(CurrHour*60)+(CurrDay*LastRunHour*60)+(CurrMon*LastRunDay*LastRunHour*60)+(CurrYear*LastRunMon*LastRunDay*LastRunHour*60) if (CurrDay-LastRunDay==1 || CurrMon-LastRunMon==1 || CurrYear-LastRunYear==1){ // При переходе между сутками, месяцами и годами, делаем поправку CurrRunTimestamp = CurrRunTimestamp+60; } Delta=CurrRunTimestamp-LastRunTimestampКак это работает видно в приложенном файле.
На выходе получаешь реальную дельту в минутах.
Костыль тот еще, но лучше ничего не получалось придумать в тот момент.
-
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login