Цикл по датам unix

Это независимый от терминала способ включения атрибута мигания. Если это не работает, значит, вы либо неверно установили тип терминала, он не включен в характеристиках терминала, либо он просто не поддерживается:

tput blink
echo hello, world
tput sgr0

База данных terminfo стоит того. просматривая ( не читая перед сном , помните), чтобы найти получитабельные имена для последовательностей оконечных escape-кодов.

3
23.05.2017, 15:39
2 ответа

Используемая дата:

$ dateA="2008-02-04 00:00:00 UTC"

Первая причина получения дат со сдвинутым временем - запрос "местных" дат:

$ date -d "$dateA"
Sun Feb  3 19:00:00 EST 2008

Что будет исправлено, если вы укажете время UTC:

$ TZ=UTC0 date -d "$dateA"
Mon Feb  4 00:00:00 UTC 2008

Или лучше (возьмите за привычку использовать это) использовать опцию -u в date:

$ date -ud "$dateA"
Mon Feb  4 00:00:00 UTC 2008

Вторая причина - запрос "относительных элементов" со знаком:

$ date -ud "$(date +"%Y-%m-%d %T" -ud "$dateA") +1 year"  ### wrong
Tue Feb  3 23:00:00 UTC 2009

$ date -ud "$(date +"%Y-%m-%d %T" -ud "$dateA") 1 year"  ### better
Mon Feb  4 00:00:00 UTC 2008

Но все проблемы со временем (обычно) исчезают, когда используется "часовой пояс" (-z):

$ date -ud "$(date +"%Y-%m-%d %T %z" -ud "$dateA") +1 year"  ### Best
Wed Feb  4 00:00:00 UTC 2009

$ date -ud "$(date +"%Y-%m-%d %T %z" -ud "$dateA") 1 year"  ### Preferred
Wed Feb  4 00:00:00 UTC 2009

Проблема связана с тем, как разбирается строка даты, если значение TZ отсутствует, +1 может быть интерпретировано как значение часового пояса:

$ date -ud "2008-02-04 00:00:00 +3 year"
Tue Feb  3 21:00:00 UTC 2009

Даже если было установлено значение среды для TZ:

$ TZ=UTC0 date -ud "2008-02-04 00:00:00 +3 year"
Tue Feb  3 21:00:00 UTC 2009

Да, год был увеличен один раз (2009 вместо 2008), но +3 было использовано для изменения представленного времени (не то, что было задумано).

Повторяю: проблема в том, что +3 может быть разобрано как значение часового пояса.


Также, для преобразования (эпохальных) секунд в даты, GNU date может использовать "@"

$ dateAsec="$( date -ud "$dateA" +"%s" )

$ date -ud @"$dateAsec"
Mon Feb  4 00:00:00 UTC 2008

Сценарий (с использованием функции (newdate)) можно написать так:

#!/bin/bash
dateI="$(date -ud "2008-02-04 00:00:00 UTC" +%s)"
dateF="$(date -u +%s)"

newdate(){ date -ud "$(date +"%Y-%m-%d %T %z" -ud @"$dateI") $1 year" +"%s"; }

n=0
while 
    dateN="$( newdate "$n" )"
    (( dateN < dateF ));
do
    dateNhuman="$(date +"%Y-%m-%d %T %z" -ud @"$dateN")"
    echo "dateN=$dateN --- $dateNhuman ---> $dateF $(( $dateF - $dateN )) $n"
    (( n++ ))
done

Результаты:

dateN=1202083200 --- 2008-02-04 00:00:00 +0000 ---> 1470543626 268460426 0
dateN=1233705600 --- 2009-02-04 00:00:00 +0000 ---> 1470543626 236838026 1
dateN=1265241600 --- 2010-02-04 00:00:00 +0000 ---> 1470543626 205302026 2
dateN=1296777600 --- 2011-02-04 00:00:00 +0000 ---> 1470543626 173766026 3
dateN=1328313600 --- 2012-02-04 00:00:00 +0000 ---> 1470543626 142230026 4
dateN=1359936000 --- 2013-02-04 00:00:00 +0000 ---> 1470543626 110607626 5
dateN=1391472000 --- 2014-02-04 00:00:00 +0000 ---> 1470543626 79071626 6
dateN=1423008000 --- 2015-02-04 00:00:00 +0000 ---> 1470543626 47535626 7
dateN=1454544000 --- 2016-02-04 00:00:00 +0000 ---> 1470543626 15999626 8

Все годы появляются и все кажется правильным.

3
27.01.2020, 21:13

Итератор на относительной дате от начальной точки может иметь больше смысла:

#!/usr/bin/env bash

START='2008-02-04 00:00:00 UTC'
END=$( date +%s )

for yearnum in $( seq 1 999 ); do
  NUDATE=$( date -d "$START + $yearnum year" +%s )
  PUNY_HUMAN_DATE=$( date -d "@$NUDATE" "+%Y-%m-%d %T %Z" )
  if [[ $NUDATE -gt $END ]]; then
    break
  fi
  echo $NUDATE $PUNY_HUMAN_DATE
done

В результате получается что-то вроде:

-bash-4.1$ bash iter
1233705600 2009-02-04 00:00:00 UTC
1265241600 2010-02-04 00:00:00 UTC
1296777600 2011-02-04 00:00:00 UTC
1328313600 2012-02-04 00:00:00 UTC
1359936000 2013-02-04 00:00:00 UTC
1391472000 2014-02-04 00:00:00 UTC
1423008000 2015-02-04 00:00:00 UTC
1454544000 2016-02-04 00:00:00 UTC
-bash-4.1$ 
3
27.01.2020, 21:13

Теги

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