1 Востаннє редагувалося funivan (22.03.2013 16:18:21)

Тема: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Отже дійсно класно читати і порівнювати різні мови. Ну що ідемо дальше?:)

Задача. У нас є дата. Треба порахувати різницю від поточної дати і і красиво вивести. Дата представлена у форматі unixtimestamp
Умови виводу.
Якщо різниця більше року показуємо: "1р. назад" або "2р. назад"
Якщо різниця більше місяця показуємо: "1м. назад" або "8м. назад"
Якщо різниця більше години показуємо: "2г. назад" або "23г. назад"
Якщо різниця більше хвилини показуємо: "5хв. назад" або "59хв. назад"

Тобто якщо різниця в часі становить 1 рік 2 місяці 15 годин і 5 хвилин показуємо тільки текст "1р. назад"

Тобто якщо різниця в часі становить 15 годин і 5 хвилин показуємо тільки текст "15г. назад"

Вперед хто на чому шарить ;)



Реалізація на Python: автор bunyk

Прихований текст

from datetime import datetime, timedelta

def ago(x):
    d = datetime.now() - datetime.fromtimestamp(x)
    if d > timedelta(days=356):
        return '%sр. назад' % (d.days // 356)
    if d > timedelta(days=30):
        return '%sм. назад' % (d.days // 30)
    if d > timedelta(days=1):
        return '%sд. назад' % d.days
    if d > timedelta(seconds=3600):
        return '%sг. назад' % (d.seconds // 3600)
    if d > timedelta(seconds=60):
        return '%sхв. назад' % (d.seconds // 60)
    if d < timedelta():
        raise Exception('назад у майбутнє!')
    return '%s сек. назад' % d.seconds
    
print(ago(1363650795))
print(ago(936365079))
print(ago(1363676795))
print(ago(1363702932))

Результат:

Прихований текст

14г. назад
13р. назад
7г. назад
18 сек. назад



Реалізація на PHP:

Прихований текст

  /**
   * @author funivan <funivan.com>
   */
  class Date_Diff_Format {

    public static function getDiff($date) {

      $oldDate = new DateTime();
      $oldDate->setTimestamp($date);
      $currentDate = new DateTime('now');

      $dateDiff = $oldDate->diff($currentDate);

      if ($dateDiff->format('%R') === '-') {
        return "Назад у майбутнє";
      }

      $dateTypes = array(
          'y' => 'р.',
          'm' => 'м.',
          'd' => 'д.',
          'h' => 'г.',
          'i' => 'хв.',
      );
      foreach ($dateTypes as $formatParam => $word) {
        $localDiff = $dateDiff->format('%' . $formatParam);
        if ($localDiff > 0) {
          return $localDiff . ' ' . $word . ' назад';
        }
      }

      return '';
    }

  }

  $date = time() - 3600 * 23;
  echo Date_Diff_Format::getDiff($date) . "\n";

  $date = time() - 3600 * 24 * 25;
  echo Date_Diff_Format::getDiff($date) . "\n";

  $date = time() - 3600 * 24 * 65;
  echo Date_Diff_Format::getDiff($date) . "\n";

  $date = time() - 3600 * 24 * 365;
  echo Date_Diff_Format::getDiff($date) . "\n";

  $date = time() + 3600 * 24 * 365;
  echo Date_Diff_Format::getDiff($date) . "\n";

Результат:

Прихований текст

23 г. назад
25 д. назад
2 м. назад
1 р. назад
Назад у майбутнє



Реалізація на Делфі автор Torbins

Прихований текст

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.DateUtils;

{$REGION 'Патч DateUtils'}
//Цей патч тут тому, що у DateUtils декларації різних *Between функцій відрізняються
function YearsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.YearsBetween(ANow, AThen);
end;

function MonthsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.MonthsBetween(ANow, AThen);
end;

function DaysBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.DaysBetween(ANow, AThen);
end;
{$ENDREGION}

type // Необхідні типи
  TBetweenIn = (boYears, boMonths, boDays, boHours, boMinutes, boSeconds);
  TBetweenFunc = function (const ANow, AThen: TDateTime): Int64;
  TBetweenRec = record
    BFunc: TBetweenFunc;
    BLabel: string;
  end;

const //Застосовуємо декларативний підхід
  BetweenArr: array [TBetweenIn] of TBetweenRec = (
    (BFunc: YearsBetween;   BLabel: 'р.'),
    (BFunc: MonthsBetween;  BLabel: 'м.'),
    (BFunc: DaysBetween;    BLabel: 'д.'),
    (BFunc: HoursBetween;   BLabel: 'г.'),
    (BFunc: MinutesBetween; BLabel: 'х.'),
    (BFunc: SecondsBetween; BLabel: 'с.')
  );

var
  AUnixTime, tmp: Int64;
  ADate: TDateTime;
  I: TBetweenIn;

begin
  try
    Read(AUnixTime); // читаємо дані...
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // виведемо що вийшло

    for I := Low(TBetweenIn) to High(TBetweenIn) do // підбираєм що підходить
    begin
      tmp := BetweenArr[i].BFunc(Date, ADate);

      if tmp > 0 then
      begin
        WriteLn(Format('%d %s %s', [Abs(tmp), BetweenArr[i].BLabel, 'назад']));
        Break;
      end;
    end;

  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.


Реалізація на С автор Bartash:

Код

#include <time.h>
#include <stdio.h>

void getTimeStamp(struct tm *comp) /* Function to receive user input datetime */
{
    /* I use loop just to make sure that user entered a valid datetime.
       It can be checked by comparing result of scanf() with number of variables being read in it. */
    do
    {
        printf("\nEnter datetime in format 'yyyy-MM-dd hh:mm:ss': ");
    }
    while( scanf("%d-%d-%d %d:%d:%d",  &(comp->tm_year), &(comp->tm_mon), &(comp->tm_mday),
                                &(comp->tm_hour), &(comp->tm_min), &(comp->tm_sec)) != 6 );
    
    /* Technical details (special for tm structure) */                
    comp->tm_year -= 1900;
    comp->tm_mon -= 1;
}

int showDiff(int diff, const char *part) /* Function to check difference for custom parts of datetime */
{
    if( diff > 0 ) /* Moment of past */
        printf("%d %s ago", diff, part);
    else if (diff < 0) /* Moment of future */
        printf("%d %s in future", abs(diff), part);
    else /* Moments are equal in this part of datetime */
        return 0;
    
    return 1; /* Difference has been detected */
}

int main()
{
    time_t now;                                             /* timestamp for now */
    struct tm now_s, comp_s;                                 /* structures to contain datetime for comparison */
    getTimeStamp(&comp_s);                                     /* receive datetime from user */
    time(&now);                                             /* get current datetime */
    now_s = *(localtime(&now));                             /* build structure based on current datetime */
    
    /* Here we use if() construct to exclude if-else sequences
       in a bit strange way. Though, it's clear enough: if there's any difference between
       values, next calls of showDiff() will not be executed. */
       
    if( showDiff(now_s.tm_year-comp_s.tm_year,"years") ||    
        showDiff(now_s.tm_mon-comp_s.tm_mon, "months") ||
        showDiff(now_s.tm_mday-comp_s.tm_mday,"days") ||
        showDiff(now_s.tm_hour-comp_s.tm_hour,"hours") ||
        showDiff(now_s.tm_min-comp_s.tm_min,"minutes") ||
        showDiff(now_s.tm_sec-comp_s.tm_sec, "seconds"));
    else
        printf("Values are equal.\n");
    
    return 0;
}

Вивід
http://s17.postimage.org/6p2x50cpr/task2.jpg

2

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

"24г назад" - це вже "1д. назад" виходить. Правильно?

3 Востаннє редагувалося bunyk (19.03.2013 17:25:49)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Python:

from datetime import datetime, timedelta

def ago(x):
    d = datetime.now() - datetime.fromtimestamp(x)
    if d > timedelta(days=356):
        return '%sр. назад' % (d.days // 356)
    if d > timedelta(days=30):
        return '%sм. назад' % (d.days // 30)
    if d > timedelta(days=1):
        return '%sд. назад' % d.days
    if d > timedelta(seconds=3600):
        return '%sг. назад' % (d.seconds // 3600)
    if d > timedelta(seconds=60):
        return '%sхв. назад' % (d.seconds // 60)
    if d < timedelta():
        raise Exception('назад у майбутнє!')
    return '%s сек. назад' % d.seconds
    
print(ago(1363650795))
print(ago(936365079))
print(ago(1363676795))
print(ago(1363702932))

14г. назад
13р. назад
7г. назад
18 сек. назад

4 Востаннє редагувалося bunyk (19.03.2013 17:34:57)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Пропоную замість "PHP & Python & Ruby & С++ & Java та багато інших" називати такі теми "Вавилонське програмування". :)

5

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Vo_Vik написав:

"24г назад" - це вже "1д. назад" виходить. Правильно?

Так вірно уже в темі поправив ;)

називати такі теми "Вавилонське програмування". smile

вавилонське особисто мені не дуже можливо якісь ще є варіанти ;)

6 Востаннє редагувалося ADR (19.03.2013 22:05:03)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Delphi

Варіант 1:

program DateBetween;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.DateUtils;

var
  AUnixTime: Int64;
  ADate: TDateTime;
begin
  try
    Read(AUnixTime); // читаємо цифри
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // напишемо що це за дата

    if YearsBetween(Date, ADate) > 0 then // якщо різниця більша за 0 років
      WriteLn(IntToStr(YearsBetween(Date, ADate)) + 'р. назад') // то виводимо в роках
    else if MonthsBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(MonthsBetween(Date, ADate)) + 'м. назад')
    else if DaysBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(DaysBetween(Date, ADate)) + 'д. назад')
    else if HoursBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(HoursBetween(Date, ADate)) + 'г. назад')
    else if MinutesBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(MinutesBetween(Date, ADate)) + 'х. назад');
  except // стандартний блок для виведення помилок
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

На дату "1234567890" видає наступне:

13.02.2009 23:31:30
4р. назад

Варіант 2:

program DateBetween;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.DateUtils;

type // перелік потрібних перемінних
  TBetweenIn = (boYears, boMonths, boDays, boHours, boMinutes, boSeconds);

function GetBetween(ANow, AThen: TDateTime; BetweenIn: TBetweenIn): Int64;
begin
  case BetweenIn of
    boYears:    Result := YearsBetween(ANow, AThen);
    boMonths:   Result := MonthsBetween(ANow, AThen);
    boDays:     Result := DaysBetween(ANow, AThen);
    boHours:    Result := HoursBetween(ANow, AThen);
    boMinutes:  Result := MinutesBetween(ANow, AThen);
    boSeconds:  Result := SecondsBetween(ANow, AThen);
  end;
  if ANow < AThen then // минуле чи майбутнє?
    Result := - Result
end;

const // позначки...
  BeforeAfterStr: array [Boolean] of string = ('назад', 'залишилось');
  ALabels: array [TBetweenIn] of string = ('р.', 'м.', 'д.', 'г.', 'м.', 'с.');
var
  AUnixTime, tmp: Int64;
  ADate: TDateTime;
  I: TBetweenIn;
begin
  try
    Read(AUnixTime); // читаємо дані...
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // виведемо що вийшло


    for I := Low(TBetweenIn) to High(TBetweenIn) do // підбираєм що підходить
      if GetBetween(Date, ADate, I) <> 0 then
      begin
        tmp := GetBetween(Date, ADate, I);
        WriteLn(Format('%d %s %s', [Abs(tmp), ALabels[i], BeforeAfterStr[tmp < 0]]));
        Break;
      end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

7

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

2ADR а що це за мова?:) переписуйте)

8

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

2ADR а що це за мова?:) переписуйте)

То Дельфі.

I belong to the Dead Generation.

9

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

2ADR а що це за мова?:) переписуйте)

Виправив)

10

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

вавилонське особисто мені не дуже можливо якісь ще є варіанти ;)

Мовобій.
PCI ("Programming: Compile or Interprete?")
Олімпіада [на Форумі].
Схоластичне програмування.
Кодопис.
...

:)

I belong to the Dead Generation.

11

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

postgresql+SQL

select case 
         when extract(year from r) >= 1 
              then format('%sр. назад', extract(year from r))
         when extract(month from r) >= 1 
              then format('%sм. назад', extract(month from r))
         when extract(day from r) >= 1 
              then format('%sд. назад', extract(day from r))
         when extract(hour from r) >= 1 
              then format('%sг. назад', extract(hour from r))
         when extract(minute from r) >= 1 
              then format('%sхв. назад', extract(minute from r))
         when extract(second from r) >= 0
              then format('%sсек. назад', extract(second from r))
         else 'назад у майбутнє! - '||replace(trim(r::text, '-'), 'days', 'д')
       end as res
from (select age(to_timestamp(dt2), to_timestamp(dt1)) as r
        from (values (extract('epoch' from now())-18), (1363650795), (936365079), (1363676795), (1363702932), (extract('epoch' from now())+18)) as f1(dt1), 
             (values ((extract('epoch' from now())))) as f2(dt2)) f
18сек. назад
23г. назад
13р. назад
16г. назад
9г. назад
назад у майбутнє! - 00:00:18
Подякували: bunyk1

12 Востаннє редагувалося Bartash (20.03.2013 12:22:37)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Реалізація на С:

Код

#include <time.h>
#include <stdio.h>

void getTimeStamp(struct tm *comp) /* Function to receive user input datetime */
{
    /* I use loop just to make sure that user entered a valid datetime.
       It can be checked by comparing result of scanf() with number of variables being read in it. */
    do
    {
        printf("\nEnter datetime in format 'yyyy-MM-dd hh:mm:ss': ");
    }
    while( scanf("%d-%d-%d %d:%d:%d",  &(comp->tm_year), &(comp->tm_mon), &(comp->tm_mday),
                                &(comp->tm_hour), &(comp->tm_min), &(comp->tm_sec)) != 6 );
    
    /* Technical details (special for tm structure) */                
    comp->tm_year -= 1900;
    comp->tm_mon -= 1;
}

int showDiff(int diff, const char *part) /* Function to check difference for custom parts of datetime */
{
    if( diff > 0 ) /* Moment of past */
        printf("%d %s ago", diff, part);
    else if (diff < 0) /* Moment of future */
        printf("%d %s in future", abs(diff), part);
    else /* Moments are equal in this part of datetime */
        return 0;
    
    return 1; /* Difference has been detected */
}

int main()
{
    time_t now;                                             /* timestamp for now */
    struct tm now_s, comp_s;                                 /* structures to contain datetime for comparison */
    getTimeStamp(&comp_s);                                     /* receive datetime from user */
    time(&now);                                             /* get current datetime */
    now_s = *(localtime(&now));                             /* build structure based on current datetime */
    
    /* Here we use if() construct to exclude if-else sequences
       in a bit strange way. Though, it's clear enough: if there's any difference between
       values, next calls of showDiff() will not be executed. */
       
    if( showDiff(now_s.tm_year-comp_s.tm_year,"years") ||    
        showDiff(now_s.tm_mon-comp_s.tm_mon, "months") ||
        showDiff(now_s.tm_mday-comp_s.tm_mday,"days") ||
        showDiff(now_s.tm_hour-comp_s.tm_hour,"hours") ||
        showDiff(now_s.tm_min-comp_s.tm_min,"minutes") ||
        showDiff(now_s.tm_sec-comp_s.tm_sec, "seconds"));
    else
        printf("Values are equal.\n");
    
    return 0;
}

Вивід
http://s17.postimage.org/6p2x50cpr/task2.jpg

З.І: окрім минулого, виводить різницю для майбутнього.

I belong to the Dead Generation.

13 Востаннє редагувалося Torbins (20.03.2013 16:01:52)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Декларативний підхід у делфі (базується на коді ADR):

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.DateUtils;

{$REGION 'Патч DateUtils'}
//Цей патч тут тому, що у DateUtils декларації різних *Between функцій відрізняються
function YearsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.YearsBetween(ANow, AThen);
end;

function MonthsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.MonthsBetween(ANow, AThen);
end;

function DaysBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := System.DateUtils.DaysBetween(ANow, AThen);
end;
{$ENDREGION}

type // Необхідні типи
  TBetweenIn = (boYears, boMonths, boDays, boHours, boMinutes, boSeconds);
  TBetweenFunc = function (const ANow, AThen: TDateTime): Int64;
  TBetweenRec = record
    BFunc: TBetweenFunc;
    BLabel: string;
  end;

const //Застосовуємо декларативний підхід
  BetweenArr: array [TBetweenIn] of TBetweenRec = (
    (BFunc: YearsBetween;   BLabel: 'р.'),
    (BFunc: MonthsBetween;  BLabel: 'м.'),
    (BFunc: DaysBetween;    BLabel: 'д.'),
    (BFunc: HoursBetween;   BLabel: 'г.'),
    (BFunc: MinutesBetween; BLabel: 'х.'),
    (BFunc: SecondsBetween; BLabel: 'с.')
  );

var
  AUnixTime, tmp: Int64;
  ADate: TDateTime;
  I: TBetweenIn;

begin
  try
    Read(AUnixTime); // читаємо дані...
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // виведемо що вийшло

    for I := Low(TBetweenIn) to High(TBetweenIn) do // підбираєм що підходить
    begin
      tmp := BetweenArr[i].BFunc(Date, ADate);

      if tmp > 0 then
      begin
        WriteLn(Format('%d %s %s', [Abs(tmp), BetweenArr[i].BLabel, 'назад']));
        Break;
      end;
    end;

  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.
Подякували: ADR1

14 Востаннє редагувалося ADR (20.03.2013 13:06:22)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Torbins написав:

Декларативний підхід у делфі (базується на коді ADR):

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.DateUtils;

{$REGION 'Патч DateUtils'}
//Цей патч тут тому, що декларації різних *Between функцій відрізняються
const
  CMillisPerDay = Int64(MSecsPerSec * SecsPerMin * MinsPerHour * HoursPerDay);

function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
var
  LTimeStamp: TTimeStamp;
begin
  LTimeStamp := DateTimeToTimeStamp(ADateTime);
  Result := LTimeStamp.Date;
  Result := (Result * MSecsPerDay) + LTimeStamp.Time;
end;

function YearsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
     div Round(CMillisPerDay * ApproxDaysPerYear);
end;

function MonthsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
    div Round(CMillisPerDay * ApproxDaysPerMonth);
end;

function DaysBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
    div CMillisPerDay;
end;
{$ENDREGION}

type // Необхідні типи
  TBetweenIn = (boYears, boMonths, boDays, boHours, boMinutes, boSeconds);
  TBetweenFunc = function (const ANow, AThen: TDateTime): Int64;
  TBetweenRec = record
    BFunc: TBetweenFunc;
    BLabel: string;
  end;

const //Застосовуємо декларативний підхід
  BetweenArr: array [TBetweenIn] of TBetweenRec = (
    (BFunc: YearsBetween;   BLabel: 'р.'),
    (BFunc: MonthsBetween;  BLabel: 'м.'),
    (BFunc: DaysBetween;    BLabel: 'д.'),
    (BFunc: HoursBetween;   BLabel: 'г.'),
    (BFunc: MinutesBetween; BLabel: 'х.'),
    (BFunc: SecondsBetween; BLabel: 'с.')
  );

var
  AUnixTime, tmp: Int64;
  ADate: TDateTime;
  I: TBetweenIn;

begin
  try
    Read(AUnixTime); // читаємо дані...
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // виведемо що вийшло

    for I := Low(TBetweenIn) to High(TBetweenIn) do // підбираєм що підходить
    begin
      tmp := BetweenArr[i].BFunc(Date, ADate);

      if tmp > 0 then
      begin
        WriteLn(Format('%d %s %s', [Abs(tmp), BetweenArr[i].BLabel, 'назад']));
        Break;
      end;
    end;

  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.

Якщо все переводити в мілісекунди то краще рахувати у UnixTime (кількість секунд з якогось там року)


program DateBetween;
 
{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.DateUtils;

type // перелік потрібних перемінних
  TBetweenIn = (boYears, boMonths, boDays, boHours, boMinutes, boSeconds);

const // позначки...
  BeforeAfterLabels: array [Boolean] of string = ('назад', 'залишилось'); // було чи буде?
  ATimeLabels: array [TBetweenIn] of string = ('р.', 'м.', 'д.', 'г.', 'м.', 'с.');
  SecondsPer: array [TBetweenIn] of Int64 =
    (SecsPerDay * 365, //DaysPerYear[False],
     SecsPerDay * DaysPerWeek,
     SecsPerDay,
     SecsPerHour,
     SecsPerMin,
     1);
var
  AUnixTime, DeltaTime, tmp: Int64;
  I: TBetweenIn;
begin
  try
    Read(AUnixTime); // читаємо дані..
    DeltaTime := DateTimeToUnix(Date) - AUnixTime;
    WriteLn(DateTimeToStr(UnixToDateTime(AUnixTime))); // виведемо що вийшло

    for I := Low(TBetweenIn) to High(TBetweenIn) do // підбираєм що підходить
    begin
      tmp := DeltaTime div SecondsPer[i];
      if tmp <> 0 then
      begin
        WriteLn(Abs(tmp), ATimeLabels[i], BeforeAfterLabels[tmp < 0]);
        Break;
      end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Але тоді виходить похибка так як місяць не завжди має 30 днів а рік 365...

15 Востаннє редагувалося Torbins (20.03.2013 13:58:59)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

ADR Той код, то копіпаста із DateUtils, і мені всерівно як він працює, справа була у різних типах функцій. Виправив свій пост, щоб це було видніше. Що стосується нюансів підрахунку днів, то це справа бібліотек, які завжди можна замінити іншими.

16

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Torbins написав:

ADR Той код, то копіпаста із DateUtils, і мені всерівно як він працює, справа була у різних типах функцій. Виправив свій пост, щоб це було видніше. Що стосується нюансів підрахунку днів, то це справа бібліотек, які завжди можна замінити іншими.

Я про *ToMiliseconds... тепер все зрозуміло. )

17

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Ага, в DateUtils використовуються веселі ApproxDaysPerMonth і ApproxDaysPerYear.

18 Востаннє редагувалося funivan (22.03.2013 11:44:59)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Torbins так який варіант для делфі використовувати?
Добавив реалізацію на  PHP дивіться у темі ;)

19

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Мені, ясна річ, мій варіант найбільше подобається. Інакше чого б я його писав ;)

20 Востаннє редагувалося Bartash (22.03.2013 13:57:37)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan, а чом сішку не додаєте у перший пост теми? Вже ж є реалізація. :)

I belong to the Dead Generation.