LINUX.ORG.RU
ФорумTalks

Начинаем обратный отсчёт до 2020-го года

 , ,


0

1

Сабж. А поможет в этом эта программа:

program timeto2020;
{$codepage utf8}
uses cwstring, sysutils, dateutils;
var
        nowtime, thentime, timediff: int64;
        ttdays, tthours, ttminutes, ttseconds: int64;
begin
        nowtime := datetimetounix(now);
        thentime := datetimetounix(encodedate(2020, 1, 1));
        timediff := thentime - nowtime;
        ttdays := timediff div 86400;
        dec(timediff, ttdays * 86400);
        tthours := timediff div 3600;
        dec(timediff, tthours * 3600);
        ttminutes := timediff div 60;
        dec(timediff, ttminutes * 60);
        ttseconds := timediff;
        writeln('до 2020 года осталось ', ttdays, ' дней, ', tthours, ' часов, ',
                ttminutes, ' минут и ', ttseconds, ' секунд.');
end.

$ ./timeto2020
до 2020 года осталось 59 дней, 11 часов, 4 минут и 28 секунд.

★★★★★
Ответ на: комментарий от Zubok

До 3 ненужно. Нужно считать до 1го и в зависимости от года переносить.

DELIRIUM ☆☆☆☆☆
()

Иногда астрономы корректируют секунды текущего времени, а у тебя поправок нету. Кто будет виноват в потерях времени/денег мировой экономики? saahriktu! :)

quickquest ★★★★★
()
Ответ на: комментарий от atrus

А так на плюсах бы ещё хуже бы выглядел.

Докажы!

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от saahriktu

Несколько не так в GetTimeSpell:

  Result := alltimesspells[3 * totswitch + 2];
  if not (tval mod 100 in [5..20]) then
    case tval mod 10 of
      1:    Result := alltimesspells[3 * totswitch];
      2..4: Result := alltimesspells[3 * totswitch + 1];
    end;

bormant ★★★★★
()
Ответ на: комментарий от Zubok

А до 3 сентября твоя программа может отсчет вести? :)

program timetoanydate;
{$codepage utf8}
uses cwstring, sysutils, dateutils;
const
	alltimesspells: array[0..11] of unicodestring = (
		'день',
		'дня',
		'дней',
		'час',
		'часа',
		'часов',
		'минута',
		'минуты',
		'минут',
		'секунда',
		'секунды',
		'секунд');
var
	nowtime, thentime, timediff: int64;
	ttdays, tthours, ttminutes, ttseconds, rgmntvl: int64;
	syear, smonth, sday, thmonth, thday: word;

function gettimespell(tval: int64; totswitch: integer): unicodestring;
var
	lstdgt: Integer;
begin
	lstdgt := tval mod 10;
	case (lstdgt) of
	1: gettimespell := alltimesspells[3 * totswitch];
	2 .. 4: gettimespell := alltimesspells[3 * totswitch + 1];
	else gettimespell := alltimesspells[3 * totswitch + 2];
	end;
end;

begin
	if ParamCount < 2 then begin
		writeln('использование: timetoanydate месяц день');
		exit;
	end;
	if TryStrToInt64(ParamStr(1), rgmntvl) = False then begin
		writeln('ошибка: неправильный аргумент 1');
		exit;
	end;
	if rgmntvl < 1 then rgmntvl := 1;
	if rgmntvl > 12 then rgmntvl := 12;
	thmonth := rgmntvl;
	if TryStrToInt64(ParamStr(2), rgmntvl) = False then begin
		writeln('ошибка: неправильный аргумент 2');
		exit;
	end;
	if rgmntvl < 1 then rgmntvl := 1;
	if rgmntvl > 31 then rgmntvl := 31;
	thday := rgmntvl;
	decodedate(now, syear, smonth, sday);
	if ((smonth > thmonth) or ((smonth = thmonth) and (sday >= thday))) then inc(syear);
	nowtime := datetimetounix(now);
	thentime := datetimetounix(encodedate(syear, thmonth, thday));
	timediff := thentime - nowtime;
	ttdays := timediff div 86400;
	dec(timediff, ttdays * 86400);
	tthours := timediff div 3600;
	dec(timediff, tthours * 3600);
	ttminutes := timediff div 60;
	dec(timediff, ttminutes * 60);
	ttseconds := timediff;
	writeln('Осталось ', ttdays, ' ',
		gettimespell(ttdays, 0) ,', ',
		tthours, ' ', gettimespell(tthours, 1), ', ',
		ttminutes, ' ', gettimespell(ttminutes, 2),' и ',
		ttseconds, ' ', gettimespell(ttseconds, 3), '.');
end.
$ ./timetoanydate 9 3
Осталось 305 дней, 6 часов, 55 минут и 41 секунда.
saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Патч:

$ diff -u timetoanydate-0.1.pas timetoanydate.pas
--- timetoanydate-0.1.pas       2019-11-02 17:09:00.949035138 +0300
+++ timetoanydate.pas   2019-11-02 17:18:48.806000099 +0300
@@ -1,3 +1,4 @@
+(* timetoanydate v0.2 under GNU GPLv3 *)
 program timetoanydate;
 {$codepage utf8}
 uses cwstring, sysutils, dateutils;
@@ -53,6 +54,10 @@
        thday := rgmntvl;
        decodedate(now, syear, smonth, sday);
        if ((smonth > thmonth) or ((smonth = thmonth) and (sday >= thday))) then inc(syear);
+       if thday > daysinmonth(encodedate(syear, thmonth, 1)) then begin
+               writeln('ошибка: в этом месяце всего ', daysinmonth(encodedate(syear, thmonth, 1)), ' дней.');
+               exit;
+       end;
        nowtime := datetimetounix(now);
        thentime := datetimetounix(encodedate(syear, thmonth, thday));
        timediff := thentime - nowtime;

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Для учета числа можно было сделать в более общем виде:

type
  TGrNum = (gnSingle, gnDual, gnPlural);
  TNumStr = array [TGrNum] of UnicodeString;

function GrN(n: Word): TGrNum;
begin
  Result := gnPlural;
  if not (n mod 100 in [5..20]) then
    case n mod 10 of
      1: Result := gnSingle;
      2..4: Result := gnDual;
    end;
end;

И использование:
const
  sDay:   TNumStr = ('день', 'дня', 'дней');
  sHour:  TNumStr = ('час', 'часа', 'часов');
  sMin:   TNumStr = ('минута', 'минуты', 'минут');
  sSec:   TNumStr = ('секунда', 'секунды', 'секунд');

...

  WriteLn(
         d, ' ', sDay[GrN(d)],
    ' ', hr, ' ', sHour[GrN(hr)],
    ' ', mn, ' ', sMin[GrN(mn)],
    ' ', sc, ' ', sSec[GrN(sc)]);

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

А для кого придумали функции DaySpan, HourSpan, MinuteSpan, SecondSpan? Паскаль - не повод быдлокодить.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Там несколько не то. Этой софтине не нужно считать отдельно разницу в часах, минутах и секундах. Ей нужно постепенно разложить разницу во времени на составляющие. Что она очень просто и делает.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)

Это можно и вручную прикинуть. Интересно чтоб результат был в часах или в минутах или в секундах. До НГ осталось Х секунд.

Lorovec
()
Ответ на: комментарий от Lorovec
{$codepage utf8}
uses SysUtils, DateUtils;

type
  TGrNum = (gnSingle, gnDual, gnPlural);
  TNumStr = array [TGrNum] of UnicodeString;

function GrN(n: LongWord): TGrNum;
begin
  Result := gnPlural;
  if not (n mod 100 in [5..20]) then
    case n mod 10 of
      1: Result := gnSingle;
      2..4: Result := gnDual;
    end;
end;

const
  sDay:   TNumStr = ('день', 'дня', 'дней');
  sHour:  TNumStr = ('час', 'часа', 'часов');
  sMin:   TNumStr = ('минута', 'минуты', 'минут');
  sSec:   TNumStr = ('секунда', 'секунды', 'секунд');
var
  df: Int64;
  d, h, m, s: Word;
begin
  df := SecondsBetween(Now, EndOfTheYear(Now)) + 1;
  WriteLn('До нового года ', df, ' ', sSec[GrN(df mod 100)]);
  d := df div 86400; df := df mod 86400;
  h := df div 3600;  df := df mod 3600;
  m := df div 60;
  s := df mod 60;
  WriteLn('или ', d, ' ', sDay[GrN(d)], ' ', h, ' ', sHour[GrN(h)],
    ' ', m, ' ', sMin[GrN(m)], ' ', s, ' ', sSec[GrN(s)]);
end.
bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

В начале темы были одни крики про ненужно, ко второй странице уже начали слать багрепорты и патчи.

urxvt ★★★★★
()
Ответ на: комментарий от cvs-255

Тут это не хинт редактору о кодировке как могло показаться на первый взгляд, директива влияет на внутреннее представление литералов,
 — без этой директивы
Char = AnsiChar, String = AnsiString
 — с ней
Char = UnicodeChar, String = UnicodeString, хранятся в памяти в UTF-16

https://wiki.freepascal.org/Unicode_Support_in_Lazarus#Assign_string_literals...

bormant ★★★★★
()

ttdays := timediff div 86400; dec(timediff, ttdays * 86400); tthours := timediff div 3600; dec(timediff, tthours * 3600); ttminutes := timediff div 60; dec(timediff, ttminutes * 60); ttseconds := timediff;

А готовых функций для декодирования всего этого в стандартной библиотеке разве нет?

question4 ★★★★★
()

encodedate(2020, 1, 1)

А мог бы сделать универсальную программу, автоматическую определяя до какого года вести отсчёт.

KivApple ★★★★★
()
Ответ на: комментарий от question4

Готовые функции для подсчёта разницы в _одной конкретной единице_ есть. А я разобрал секунды на ряд нескольких.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от KivApple

http://saahriktu.org/downloads/timetoanydate-0.5.tar.xz

./timetoanydate 2 29
Осталось 118 дней, 2 часа, 13 минут и 59 секунд.
$ ./timetoanydate 1 1 1984
Осталось -13089 дней, -21 часов, -46 минут и -55 секунда.
$ ./timetoanydate 7 16 2099
Осталось 29110 дней, 2 часа, 12 минут и 2 секунды.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Deleted

лунный календарь народности Тупайя

Я писал на делфях генератор гороскопов...

Zhbert ★★★★★
()

На гитхаб-то залил?

Zhbert ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.