Юникс-время на Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Lord_Shinnok, 14 Oct 2011.

Thread Status:
Not open for further replies.
  1. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    У меня проблема - не могу перевести юникс-время в привычный формат времени. Смотрел в гугле, пробовал делать что он там выдал - не выходит, выдает ошибки либо о несоответствии типов либо еще различные.
    Кто может дать нормальную процедуру перевода юникс-времени в привычный формат?

    и еще проблема - в StringGrid задан ScroolBar (который встроен в компонент), но он не прокручивается. менять размеры самого StringGrid нецелесообразно, потому что количество строк в таблице не фиксировано, и может достигать как нескольких сотен, так и 1-2 строки.
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    1) В гугле куча рабочих примеров
    2) В гугле куча описаний чем тот формат отличается от другого, и не составит труда написать свою функцию
    Вот 100% после этих слов ясно что ты даже не пробовал.
    т.к. и Unix-тип и тот, который применяется в делфи это LongInt
    так что никакой ошибки о несоответствии типов быть не может, в крайнем случае просто отображается неверное время
    P.S. сел писать прогу под Вконтакт, будь добр потрать пол-часика времени на эту мелочь :)
     
  3. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    она не для контакта. я с социалками вообще не связываюсь.
    то что брал с гугла - выдавало что типа несоответствие типа - Cardinal (вроде так пишется) со String (в примере использовался String.
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Не, ну я не спорю, но допустим
    1) ты почитал инфу
    2) ты здравомыслящий человек
    3) ты знаешь что оба типа - обычное число

    тогда какого ты берешь пример с Cardinal и string?
     
  5. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    А разве в обычном формате даты не используются разделители вроде точек и прочего?
    то есть как я понял поискать другие примеры и попробовать реализовать их?
    щас попробую, но тема пусть пока будет открытой, на всякий случай.
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    так подожди, ты число из строки пытаешься перевести? о.О
    тогда используй StrToDateTime, переводи свою строку в TDateTime (он же LongInt), а его уже переводи в Unix-формат
     
  7. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Code:
    param:= UnixTimeToStr(copy(s, 1, k-1), -60); 
    вот код.
    выдает ошибку [Error] Unit5.pas(124): Incompatible types: 'Cardinal' and 'String'
     
  8. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Я не знаю что такое UnixTimeToStr, но я думаю. что там, куда ты пытаешься засунуть строку надо засовывать число.

    Code:
    uses DateUtils;
    [B]function[/B] UnixToDateTime(const AValue: Int64): TDateTime;
    
    [B]Description[/B]
    
    Call UnixToDateTime to convert the Unix/Linux encoding of a date and time value into the corresponding TDateTime.
    
    Unix date-and-time values are encoded as the number of seconds since midnight at the start of January 1, 1970. 
    Переводит формат из Unix в тот, который делфи использует.
     
  9. fuckyoupig

    fuckyoupig Member

    Joined:
    1 Mar 2011
    Messages:
    0
    Likes Received:
    11
    Reputations:
    2
    Вторая ссылка в яндексе
    Code:
    const
    UnixDateDelta = 25569; { 1970-01-01T00:00:00,0 }
    SecPerMin = 60;
    SecPerHour = SecPerMin * 60;
    SecPerDay = SecPerHour * 24;
    MinDayFraction = 1 / (24 * 60);
     
    {Convert Unix time to TDatetime}
     
    function UnixTimeToDateTime(AUnixTime: DWord; ABias: Integer): TDateTime;
    begin
    Result := UnixDateDelta + (AUnixTime div SecPerDay) { Days }
    + ((AUnixTime mod SecPerDay) / SecPerDay) { Seconds }
    - ABias * MinDayFraction { Bias to UTC in minutes };
    end;
     
    {Convert Unix time to String with locale settings}
     
    function UnixTimeToStr(AUnixTime: DWord; ABias: Integer): string;
    begin
    Result := FormatDateTime('ddddd  hh:nn:ss', UnixTimeToDateTime(AUnixTime, ABias));
    end;
     
    {Convert TDateTime to Unix time}
     
    function DateTimeToUnixTime(ADateTime: TDateTime; ABias: Integer): DWord;
    begin
    Result := Trunc((ADateTime - UnixDateDelta) * SecPerDay) + ABias * SecPerMin;
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    Label1.Caption := UnixTimeToStr(977347109, -60);
    end;
     
    2 people like this.
  10. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    смотрел. но не очень разобрался что к чему.
    но сейчас нашел еще один код интересный, пробую его делать. если все получится, то напишу здесь
     
  11. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    что-то мне подсказывает, что правильно использовать ее нужно так:
    Code:
    param:= UnixTimeToStr(strtoint(copy(s, 1, k-1)), -60);
    
     
  12. Lord_Shinnok

    Lord_Shinnok New Member

    Joined:
    30 Jul 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    все нормально.перевод формата даты в нормлаьный работает хорошо. осталась проблемка одна - непрокручивается таблица, то есть ScroolBar ее не прокручивает.

    все. нашел где была ошибка. бегунок не двигался потому что я ошибочно присвоилсвойству enabled значение false (ранее требовалось, но теперь мешает,да и уже не требуется).

    ответт получен, тему можно закрыть
     
    #12 Lord_Shinnok, 14 Oct 2011
    Last edited by a moderator: 14 Oct 2011
Thread Status:
Not open for further replies.