Перевод даты в секунды

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Sherry
Сообщения: 6

Перевод даты в секунды

Сообщение Sherry »

У меня есть дата форматом - 2006 12 05 23 37 53
Как ее перевести в секунды?
Спасибо сказали:
FatZer
Сообщения: 33
ОС: Gentoo

Re: Перевод даты в секунды

Сообщение FatZer »

Sherry писал(а):
13.06.2012 11:17
У меня есть дата форматом - 2006 12 05 23 37 53
Как ее перевести в секунды?

в секунды с эпохи? как-то так:
date -d "2006-12-05 05:23:37" +%s
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Перевод даты в секунды

Сообщение watashiwa_daredeska »

Код: Выделить всё

d=$(echo '2006 12 05 23 37 53' | awk '{print $1 "-" $2 "-" $3 "T" $4 ":" $5 ":" $6}')
date -d "$d" +%s
Спасибо сказали:
Sherry
Сообщения: 6

Re: Перевод даты в секунды

Сообщение Sherry »

watashiwa_daredeska писал(а):
13.06.2012 11:53

Код: Выделить всё

d=$(echo '2006 12 05 23 37 53' | awk '{print $1 "-" $2 "-" $3 "T" $4 ":" $5 ":" $6}')
date -d "$d" +%s

date не срабатывает - выдает:
illegal option -- d
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Перевод даты в секунды

Сообщение sash-kan »

Sherry писал(а):
13.06.2012 15:12
date не срабатывает
а что выдают команды:
$ type date
$ which date
$ date --version
$ uname -a
?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Sherry
Сообщения: 6

Re: Перевод даты в секунды

Сообщение Sherry »

sash-kan писал(а):
13.06.2012 16:11
Sherry писал(а):
13.06.2012 15:12
date не срабатывает
а что выдают команды:
$ type date
$ which date
$ date --version
$ uname -a
?

$ type date
date is hashed (/usr/bin/date)
$ which date
/usr/bin/date
$ date --version
date [-u] mmddHHMM [[cc]yy][.SS]
date [-u] [+format]
date -a [-] sss[.fff]
$ uname -a
SunOS 5/10 Generic_142900-07 sun4u
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Перевод даты в секунды

Сообщение sash-kan »

Sherry писал(а):
13.06.2012 17:17
SunOS
вот и вызывайте ваш date в соответствии с вашим man-ом·
отсюда:
$ man date
или (возможно, не очень актуально, но, судя по виду, достаточно близко) отсюда
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Перевод даты в секунды

Сообщение SLEDopit »

sash-kan писал(а):
13.06.2012 17:53
вот и вызывайте ваш date в соответствии с вашим man-ом·
Емнип, в солярке date кастрированный и не поддерживает подобные преборазования.
Спасти может perl или шельная наколенка.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Перевод даты в секунды

Сообщение Ленивая Бестолочь »

если кому-нибудь интересно, могу предложить свой способ для солярис.

Код: Выделить всё

file=$(mktemp)
touch -m -t [[CC]YY]MMDDhhmm[.SS]  $file
truss -v lstat -t lstat ls -l $file 2>&1 1>/dev/null | grep 'mt = ' | awk '{print $9}'
rm -f $file

понятное дело, дату надо подставить в нужное место, думаю это ни у кого проблем не вызовет.

типа суть в том, что ни перла, ни авка нет (не будем считать однострочник-идиому).
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод даты в секунды

Сообщение drBatty »

ну... А я-бы так сделал:

Код: Выделить всё

       #define _XOPEN_SOURCE
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <time.h>

       int
       main(void)
       {
           struct tm tm;
           char buf[255];

           memset(&tm, 0, sizeof(struct tm));
           strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
           strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm);
           puts(buf);
           exit(EXIT_SUCCESS);
       }

CONFORMING TO
SUSv2, POSIX.1-2001.

STRPTIME(3)

PS: mktime(3) нужна для расковыривания struct tm.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Перевод даты в секунды

Сообщение NickLion »

perl:

Код: Выделить всё

echo '2006 12 05 23 37 53' | perl -e 'use POSIX; my ($yy,$mm,$dd,$h,$m,$s)=split / /,<>; print mktime($s,$m,$h,$dd,$mm-1,$yy-1900)."\n";'

mktime работает с локальным часовым поясом.

То же самое, но не POSIX, а модули perl'а

Код: Выделить всё

echo '2006 12 05 23 37 53' | perl -e 'use Time::Local; my ($yy,$mm,$dd,$h,$m,$s)=split / /,<>; print timelocal($s,$m,$h,$dd,$mm-1,$yy-1900)."\n";'


И со временем в UTC

Код: Выделить всё

echo '2006 12 05 23 37 53' | perl -e 'use Time::Local; my ($yy,$mm,$dd,$h,$m,$s)=split / /,<>; print timegm($s,$m,$h,$dd,$mm-1,$yy-1900)."\n";'


PS да, время можно напрямую в однострочнике perl'а задавать, а не split от входа делать
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Перевод даты в секунды

Сообщение Ленивая Бестолочь »

drBatty писал(а):
15.06.2012 09:00
main(void)

прикольно, не знал, что так можно. думал можно или перечесления или определения параметров.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Перевод даты в секунды

Сообщение NickLion »

Ленивая Бестолочь писал(а):
15.06.2012 16:54
drBatty писал(а):
15.06.2012 09:00
main(void)

прикольно, не знал, что так можно. думал можно или перечесления или определения параметров.

Если говорим о Си (без ++), то ведь единственный способ объявить функцию без параметров, т.к. func() — это функция с переменным числом параметров.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод даты в секунды

Сообщение drBatty »

Ленивая Бестолоч... писал(а):
15.06.2012 16:54
прикольно, не знал, что так можно. думал можно или перечесления или определения параметров.

можно... Это, кстати, не моя отсебятина, а цитата из man3, для тех, кто не понял.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Перевод даты в секунды

Сообщение /dev/random »

NickLion писал(а):
15.06.2012 17:00
Если говорим о Си (без ++), то ведь единственный способ объявить функцию без параметров, т.к. func() — это функция с переменным числом параметров.

Во всех более-менее современных стандартах func() - это синоним func(void).
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Перевод даты в секунды

Сообщение NickLion »

/dev/random писал(а):
15.06.2012 21:43
Во всех более-менее современных стандартах func() - это синоним func(void).

Можно подробнее? Открыл Committee Draft C11 (не C++11, а С11, естественно), там говорится что func(void) — функция без параметров (no parameters), а func() — это функция без указания спецификации параметров (no parameter specification). Ни слова о приравнивании к func(void). Только в планах на будущее объявить эту конструкцию устаревшей (но не приравнять опять же).

PS Не доказательство, но код:

Код: Выделить всё

#include <stdio.h>

int func() { return 3; }

int main(void)
{
    func(1,2,3,4,5);
    return 0;
}


компилируется GCC 4.7 даже при указании последнего стандарта:
gcc a.c -std=c11
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Перевод даты в секунды

Сообщение /dev/random »

NickLion писал(а):
17.06.2012 14:58
Можно подробнее? Открыл Committee Draft C11 (не C++11, а С11, естественно), там говорится что func(void) — функция без параметров (no parameters), а func() — это функция без указания спецификации параметров (no parameter specification).

Хм. Вы оказались ближе к истине, чем я, хотя тоже немного промахнулись. Просмотрев несколько статей и пару справочников в интернете, я получил вот что.

Есть 4 варианта объявления функции без указания параметров:
void foo(); // нет определения, нет прототипа
void foo() { /* тело */ } // есть определение, нет прототипа
void foo(void); // нет определения, есть прототип
void foo(void) { /* тело */ } // есть определение, есть прототип

В третьем и четвёртом вариантах функция имеет прототип, в котором явно указано, что она не принимает параметров. Компилятор обязан в этом убедиться.

Во втором варианте есть определение, а в стандарте написано (c99, 6.7.5.3.14; c11, 6.7.6.3.14): "An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters" (выделено мной). Т.е. при этом тоже явно задано, что функция не имеет параметов. Но, поскольку отсутствует прототип, стандарт не указывает, должен ли компилятор проверять корректность вызовов. Некоторые компиляторы проверяют, некоторые - нет. Например, gcc не проверяет вообще, clang проверяет и выдаёт предупреждение; есть ли компиляторы, которые выдают ошибку, я не знаю, но это поведение тоже будет соответствовать стандарту.

В первом варианте список параметров неизвестен и компилятор должен допускать любые.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Перевод даты в секунды

Сообщение smaharbA »

awk -v x='2006 12 05 23 37 53' 'END { print mktime(x) }' /dev/null
Я конечно далек от мысли...(с)
Спасибо сказали: