Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2016, 19:21   #1
revijah
 
Регистрация: 24.05.2016
Сообщений: 5
По умолчанию UnixTime конвектр

Здравствуйте, форумчане!

Возник вопрос: есть время в unix, как мне его конвертировать в такой вид:

Если допустим:

Epoch timestamp: 1464106755
Обычное время: Tue, 24 May 2016 16:19:15 GMT

как из этого получить Сегодня 16:19

Если это предыдущий день:

Epoch timestamp: 1464020355
Обычное время: Mon, 23 May 2016 16:19:15 GMT

то получить Вчера 16:19

Если уже позавчера и дальше то вывести просто дату 22 May

Заранее благодарен!
revijah вне форума Ответить с цитированием
Старый 25.05.2016, 09:37   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Подключите DateUtils к вашему модулю.

Код:
uses DateUtils;
...
function UnixTimeToMyFormat(const AUnixDT:Int64):string;
var
  LDT:TDateTime;
begin
  //конвертируем время из unix-формата в стандартный вид
  LDT:=UnixToDateTime(AUnixDT);

  //вычисляем результат
  case DaysBetween(Now,LDT) of
    0://если сегодня
      Result:=Format('Сегодня %s',[FormatDateTime('hh:nn',LDT)]);
    1://если вчера
      Result:=Format('Вчера %s',[FormatDateTime('hh:nn',LDT)]);
  else//любой более поздний день
    Result:=FormatDateTime('dd mmm',LDT);
  end;
end;
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 25.05.2016 в 09:43.
3D Hunter вне форума Ответить с цитированием
Старый 27.05.2016, 09:55   #3
revijah
 
Регистрация: 24.05.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Подключите DateUtils к вашему модулю.

Код:
uses DateUtils;
...
function UnixTimeToMyFormat(const AUnixDT:Int64):string;
var
  LDT:TDateTime;
begin
  //конвертируем время из unix-формата в стандартный вид
  LDT:=UnixToDateTime(AUnixDT);

  //вычисляем результат
  case DaysBetween(Now,LDT) of
    0://если сегодня
      Result:=Format('Сегодня %s',[FormatDateTime('hh:nn',LDT)]);
    1://если вчера
      Result:=Format('Вчера %s',[FormatDateTime('hh:nn',LDT)]);
  else//любой более поздний день
    Result:=FormatDateTime('dd mmm',LDT);
  end;
end;
почему-то вчерашний день определяет как сегодня...
revijah вне форума Ответить с цитированием
Старый 27.05.2016, 10:19   #4
revijah
 
Регистрация: 24.05.2016
Сообщений: 5
По умолчанию

проблему решил!

Код:
  case trunc(Now) - trunc(LDT) of
revijah вне форума Ответить с цитированием
Старый 27.05.2016, 14:31   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

а вы учитываете GMT-формат времени? в каком часовом поясе ваше юниксовое время представлено? может в этом причина.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 27.05.2016, 18:57   #6
revijah
 
Регистрация: 24.05.2016
Сообщений: 5
По умолчанию

проблема была в том что функция DaysBetween возвращает разность в целых днях.
А вот учитывать GMT формат времени хотелось бы исходя из выставленных настроек в ОС, но не знаю как это сделать
revijah вне форума Ответить с цитированием
Старый 27.05.2016, 19:33   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
проблема была в том что функция DaysBetween возвращает разность в целых днях
Убери время из даты и все будет нормально возвращать
Код:
case DaysBetween(Trunc(Now),Trunc(LDT)) of
или
case DaysBetween(Date,Trunc(LDT)) of
Цитата:
А вот учитывать GMT формат времени хотелось бы исходя из выставленных настроек в ОС
GetTimeZoneInformation
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.05.2016 в 19:40.
Аватар вне форума Ответить с цитированием
Старый 27.05.2016, 20:29   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Цитата:
А вот учитывать GMT формат времени хотелось бы исходя из выставленных настроек в ОС, но не знаю как это сделать
Узнаете сдвиг вашего юниксового времени в соответствии с региональными настройками ОС:
Код:
  with TTimeZone.Local.GetUtcOffset(LDT) do
    <используйте свойство Hours:Integer>;
UPD:
Либо же используйте TTimeZone.Local.ToUniversalTime() или TTimeZone.Local.ToLocalTime().
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 28.05.2016 в 09:08.
3D Hunter вне форума Ответить с цитированием
Старый 29.05.2016, 12:37   #9
revijah
 
Регистрация: 24.05.2016
Сообщений: 5
По умолчанию

А ещё вопрос сюда же, а как склонять месяц по падежам? т.е. что-бы выводилось не 08 май, а 8 мая?
revijah вне форума Ответить с цитированием
Старый 29.05.2016, 15:10   #10
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
const
  MY_MONTH_NAMES:array[1..12] of string = ('января','февраля','марта',
                                           'апреля','мая','июня','июля',
                                           'августа','сентября','октября',
                                           'ноября','декабря');
var
  i:Integer;
  LFS:TFormatSettings;
begin
  LFS:=TFormatSettings.Create;
  for i:=1 to 12 do
    LFS.ShortMonthNames[i]:=MY_MONTH_NAMES[i];

  Caption:=FormatDateTime('dd mmm',Now,LFS);
end;
Смысл понятен? А вообще все это есть в хелпе. Клавиша F1
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sql TIMESTAMP to unixtime mrgrudge PHP 2 21.09.2011 14:47