Как получить разницу между текущей и другой датой (в минутах) с помощью ksh (или другого сценария оболочки)? - PullRequest
1 голос
/ 28 марта 2012

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

date1 = Mon Feb 27 16:21:34 WET 2012
date2 = Mon Feb 27 16:29:34 WET 2012

Как я могу сделать разницу (в минутах) между ними, используя ksh?

Я использую Solaris 10.


Я сделал то, что вы сказали, и это была ошибка:

$ function d { echo $((($(date -d"$2" +%s)-$(date -d"$1" +%s))/60)); }
$ d "Mon Feb 27 16:21:34 WET 2012" "Mon Feb 27 16:29:34 WET 2012"
date: illegal option -- d
date: illegal option -- M
date: illegal option -- o
date: illegal option -- n
date: illegal option --
date: illegal option -- F
date: illegal option -- e
date: illegal option -- b
date: illegal option --
date: illegal option -- 2
date: illegal option -- 7
date: illegal option --
date: illegal option -- 1
date: illegal option -- 6
date: illegal option -- :
date: illegal option -- 2
date: illegal option -- 9
date: illegal option -- :
date: illegal option -- 3
date: illegal option -- 4
date: illegal option --
date: illegal option -- W
date: illegal option -- E
date: illegal option -- T
date: illegal option --
date: illegal option -- 2
date: illegal option -- 0
date: illegal option -- 1
date: illegal option -- 2
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]
date: illegal option -- d
date: illegal option -- M
date: illegal option -- o
date: illegal option -- n
date: illegal option --
date: illegal option -- F
date: illegal option -- e
date: illegal option -- b
date: illegal option --
date: illegal option -- 2
date: illegal option -- 7
date: illegal option --
date: illegal option -- 1
date: illegal option -- 6
date: illegal option -- :
date: illegal option -- 2
date: illegal option -- 1
date: illegal option -- :
date: illegal option -- 3
date: illegal option -- 4
date: illegal option --
date: illegal option -- W
date: illegal option -- E
date: illegal option -- T
date: illegal option --
date: illegal option -- 2
date: illegal option -- 0
date: illegal option -- 1
date: illegal option -- 2
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]
0
$

Ответы [ 3 ]

1 голос
/ 28 марта 2012

У вас нет даты GNU.Возможно, у вас установлен Tcl:

$ printf 'puts [expr {abs([clock scan "%s"]-[clock scan "%s"])/60}]' "$date1" "$date2" | tclsh
8
1 голос
/ 06 апреля 2012

хорошо, вот программа на C, которая может работать.он (слегка) протестирован на Solaris.

использует стандартную функцию POSIX strptime (3) для анализа заданной строки и печатает результат в секундах эпохи.

ввызов теории должен быть

$ ./strptime "Mon Feb 27 16:21:34 WET 2012" "%a %b %e %H:%M:%S %Z %Y"

, но я не смог заставить его распознавать часовой пояс "WET", поэтому вам, возможно, нужно просто указать это как литерал:

$ ./strptime "Mon Feb 27 16:21:34 WET 2012" "%a %b %e %H:%M:%S WET %Y"
1330377694

вот код:

#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>

#define ARGS 3
#define USAGE printf("Usage: %s string format\n",argv[0]);
#define EARGS { printf("%s: %s arguments (%d)\n",argv[0],argc<ARGS?"Insufficient":"Too many",argc-1); USAGE; exit(2); }

#define err(_s,_p,_f) {fprintf(stderr,"%s: %s: %s\n",(_p),(_f),strerror(errno));exit(_s);}

int main(int argc,char**argv){
        struct tm tm;
        time_t t;

        if(argc!=ARGS)EARGS;

        strptime(argv[1],argv[2],&tm);
        if(-1==(t=mktime(&tm)))err(1,argv[0],"mktime");
        if(0>printf("%lld\n",(long long)t))err(1,argv[0],"printf");
        return 0;
}

скомпилируйте что-нибудь в соответствии с

$ CFLAGS='-W -Wall -Wshadow -std=gnu99' make strptime

(вероятно, требуется gcc, не знаю, будет ли работать здесь sun cc)

1 голос
/ 28 марта 2012

с использованием date, который поддерживает -d,

$ function d { echo $((($(date -d "$2" +%s)-$(date -d "$1" +%s))/60)); }
$ d "Mon Feb 27 16:21:34 WET 2012" "Mon Feb 27 16:29:34 WET 2012"
8
...