Сравнение дат в рельсах

Вариант 1

Введите следующие строки:

adb shell
su
bash
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"\$\(echo \1\) \$\(pidof \1\)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
function pid2pkg() { pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d ' ' -f1 | head -1); if [ "$pkgName" != "" ] ; then echo $pkgName; else echo "*NOT RUNNING*"; fi }
eval "$(logcat -d | sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\2 \$\(pid2pkg \3\) \5/g' | sed -r -e 's/(.+)/echo -e \"\1\"/g')"

Выход логарифма будет иметь следующий формат:

[Time] [Name] [Type] [Message]

Пример:

14:34:59.386 wpa_supplicant E wpa_supplicant: nl80211: Failed to set IPv4 unicast in multicast filter
14:35:02.231 com.android.phone D TelephonyProvider: subIdString = 1 subId = 1
14:35:03.469 android.hardware.wifi@1.0-service E WifiHAL : wifi_get_logger_supported_feature_set: Error -3 happened.
14:35:03.518 system_server I WifiService: getWifiApEnabledState uid=10086
14:35:03.519 dev.ukanth.ufirewall D AFWall  : isWifiApEnabled is false
14:35:03.520 system_server I GnssLocationProvider: WakeLock released by handleMessage(UPDATE_NETWORK_STATE, 0, 123)
14:35:03.522 dev.ukanth.ufirewall I AFWall  : Now assuming wifi connection

Некоторые системные процессы не имеют пакетов. system_server и wpa_supplicant, например. Если имя пакета не может быть найдено, вместо него будет отображаться имя процесса.

Предостережения:

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

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

Таким образом, вы можете проверить, как долго процесс действительно запущен :

ps -e -o pid -o stime -o name

Вариант 2

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

better_logging.sh

PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"\$\(echo \1\) \$\(pidof \1\)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
MAX_LEN=$(echo "$PID_LIST_CACHE" | cut -d ' ' -f1 | awk '{ if ( length > L ) { L=length} }END{ print L}')
function pid2pkg() {
    pkgName=$(echo "$PID_LIST_CACHE" | grep -w $1 | cut -d ' ' -f1 | head -1);
    if [ "$pkgName" != "" ] ; then
        printf "%-${MAX_LEN}s" "$pkgName";
    else
        printf "%-${MAX_LEN}s" "";
    fi
}

eval "$(\
logcat -d | \
sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\2\ $\(pid2pkg \3\) \5/g' | \
sed -r -e 's/(.+)/echo -e \"\1\"/g' \
)" | \
awk '
function color(c,s) {
    printf("\033[%dm%s\033[0m\n",90+c,s)
}
/ E / {color(1,$0);next}
/ D / {color(2,$0);next}
/ W / {color(3,$0);next}
/ I / {color(4,$0);next}
{print}
'

Чтобы скопировать и запустить его, вы можете использовать:

adb push better_logging.sh /sdcard/better_logging.sh
adb shell "bash /sdcard/better_logging.sh"

Выход будет выглядеть следующим образом:

30
задан Kick Buttowski 16 September 2016 в 18:30
поделиться

2 ответа

Да, вы можете используйте операторы сравнения для сравнения дат, например:

irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true

Но вы пытаетесь сравнить дату с datetime?

Если это так, вам нужно преобразовать datetime в дату, а затем провести сравнение.

Надеюсь, это поможет.

44
ответ дан 27 November 2019 в 22:19
поделиться

Да, вы можете напрямую сравнить значение поля даты / времени created_at ActiveRecord с обычным объектом DateTime (например, с тем, который вы можете получить при синтаксическом анализе). строка, которая у вас есть).

В проекте у меня есть объект Value, который имеет объект datetime created_at:

imac:trunk luca$ script/console
Loading development environment (Rails 2.3.2)
>> Value.first.created_at
=> Fri, 12 Jun 2009 08:00:45 CEST 02:00
>> Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> Wed Jun 03 22:57:45 0200 2009
>> Value.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> true

Поле created_at определяется как:

  create_table "values", :force => true do |t|
    [...]
    t.datetime "created_at"
  end

NB, если ваше поле является датой, а не datetime, тогда вам нужно преобразовать его во время:

Post.first.created_at.to_time > Time.parse("2009-06-03 16:57:45.608000 -04:00")

или проанализировать дату:

Post.first.created_at > Date.parse("2009-06-03 16:57:45.608000 -04:00")

, иначе вы получите:

ArgumentError: comparison of Date with Time failed
10
ответ дан 27 November 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: