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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2017, 11:09   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию Прибавить 3 часа

Здравствуйте!
Есть время в таком формате:

Цитата:
Сегодня в 7:10
Сегодня в 18:00
Сегодня в 22:00
Завтра в 7:10
Завтра в 18:00
Завтра в 22:00
нужно к нему прибавить 3 часа, и учитывать смену суток, например
Сегодня в 22:00 + 3 часа = Завтра в 01:00
Завтра в 22:00 + 3 часа = Послезавтра в 01:00
nibufep вне форума Ответить с цитированием
Старый 04.03.2017, 11:37   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

можно приблизительно(надо проверять "нарезку" copy) так.

Код:
const st: array[0..2] of string =('сегодня', 'завтра', '????');

s:='сегодня в ...';
k1:=1; k2:=posEx(' ', s, k1);
d:=copy(s,k1, k2-k1);
k1:=k2; k2:=posex('в ',s,k1);
k1:=k2; k2:=posex(':',s,k1);
h:=copy(s,k1,k2-k1);
k1:=k2; k2:=length(s);
m:=copy(s,k1,k2);

dt:=high(st);
for j:=low(st) to high(st) do 
  if d=st[j] then begin dt:=j; break; end;

ht:=strtoint(h);
mt:=strtoint(m);

mt:=mt;
dt:=dt +(ht+3) div 24;
ht:=(ht 3) mod 24;

if dt>high(st) then dt:=high(dt);
result:=format('%s в %d:%d', [ st[dt], nt,mt ]);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.03.2017 в 11:40.
evg_m на форуме Ответить с цитированием
Старый 04.03.2017, 11:40   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  s:='Завтра в 22:00';
  i:=Pos(' в ',s);
  j:=Pos(':',s);
  h:=StrToInt(Copy(s,i+3,j-i-3));
  d:=IncHour(EncodeTime(h,0,0,0),3);
  if HourOf(d)>h then s1:=Copy(s,1,i+2)
  else if Copy(s,1,3)='Сег' then s1:='Завтра в '
  else s1:='Послезавтра в ';
  s1:=Format('%s%d:00',[s1,HourOf(d)]); //результат
Учти, без всякого анализа на чепуху в строке, и только для сегодня и завтра
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.03.2017, 12:19   #4
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Код:
DecodeDateTime(dt, myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
Как настроить формат у этой функции? Нужно чтобы myHour и myMin возвращал не 0 а 00
nibufep вне форума Ответить с цитированием
Старый 04.03.2017, 12:35   #5
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

uses ...DataUtils

И использовать DateTimeToUnix

Код:
DateTimeToUnix(now) переведет текущую дату(now) в секунды. Добавить 3 часа в секундах и конвертнуть обратно.

var
DateFormat:TFormatSettings;

begin
  DateFormat.ShortDateFormat:= 'yyyy-mm-dd hh:mm:ss';
  DateFormat.DateSeparator :='-';
  DateFormat.TimeSeparator:=':'; 
end;
Еще есть FormatDateTime.

Вобщем можно организовать работу с датой/временем, ну а "сегодня, завтра, послезавтра" можно условиями определять
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось Вадим Мошев; 04.03.2017 в 12:59.
arriah вне форума Ответить с цитированием
Старый 04.03.2017, 12:43   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Как настроить формат у этой функции? Нужно чтобы myHour и myMin возвращал не 0 а 00
А как ты себе представляешь, что бы в переменной word был 00, а не 0 ?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.03.2017, 12:45   #7
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от nibufep Посмотреть сообщение
Код:
DecodeDateTime(dt, myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
Как настроить формат у этой функции? Нужно чтобы myHour и myMin возвращал не 0 а 00
Код:
var
  hour,minute,seconds:string;
begin
  hour:=FormatDateTime('hh',now);
  minute:=FormatDateTime('nn',now);
  seconds:=FormatDateTime('ss',now);
end;
Цитата:
y = Год из 2-х последних цифр
yy = Год из 2-х последних цифр
yyyy = Год из 4-х цифр
m = Номер месяца без 0
mm = Номер месяца как 2 цифры
mmm = Месяц используя ShortDayNames (Янв)
mmmm = Месяц используя LongDayNames (Январь)
d = Число без 0
dd = Число как 2 цифры
ddd = Число используя ShortDayNames (Воск)
dddd = Число используя LongDayNames (Воскресенье)
ddddd = Число в ShortDateFormat
dddddd = Число в LongDateFormat

c = Используя ShortDateFormat + LongTimeFormat
h = Час без 0
hh = Час как 2 цифры
n = Минуты без 0
nn = Минуты как 2 цифры
s = Секунды без 0
ss = Секунды как 2 цифры
z = Миллисекунды без 0
zzz = Миллисекунды как 2 цифры
t = Используя ShortTimeFormat
tt = Используя LongTimeFormat

am/pm = Используется после h : выдаёт 12 часов + am/pm
a/p = Используется после h : выдаёт 12 часов + a/p
ampm = Как a/p но TimeAMString,TimePMString
/ = Заменяется значением DateSeparator
: = Заменяется значением TimeSeparator
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось Вадим Мошев; 04.03.2017 в 12:59.
arriah вне форума Ответить с цитированием
Старый 04.03.2017, 13:17   #8
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Ну вот небольшой примерчик, чтобы понятно было как и что работает.
Ну а определить Сегодня, Завтра - это уже не сложно.
Главное на мой взгляд, корректно добавить 3 часа.
Причем сработает даже если 28.02.2017 22:00 добавить 3 часа, то вернет 1 марта 01:00 , ну а если год високосный, то вернет 29 февраля 01:00
Код:
uses ...DataUtils;

var
  str:string;
  DateF:TFormatSettings;
  tmp:string;
  DT:TDateTime;
  DTUnix:integer;
  hh,mm:string;
begin
  str:='Сегодня 22:32';
  delete(str,1,pos(' ',str));
  DateF.ShortDateFormat:='dd.mm.yyyy hh:mm';
  DateF.DateSeparator:='.';
  DateF.TimeSeparator:=':';
  //сформируем нужную дату со временем
  tmp:=DateTostr(now)+' '+str;
  DT:=StrToDateTime(tmp,DateF); //в DT дата время
  DTUnix:=DateTimeToUnix(DT)+10800; //конвертнем в unixtime и добавим 3 часа в секундах
  DT:= UnixToDateTime(DTUnix);

  hh:=FormatDateTime('hh',DT);
  mm:=FormatDateTime('nn',DT);

  showmessage(hh+':'+mm);
end;
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Старый 04.03.2017, 15:52   #9
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Сидел, скучно
вот сотворил

PS: Embarcadero® Delphi® 2010 Version 14.0.3593.25826
Вложения
Тип файла: zip other.zip (404.0 Кб, 12 просмотров)
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прибавить 1 input limon142 JavaScript, Ajax 3 19.01.2014 23:15
Прибавить дату по условию tevadim Microsoft Office Excel 7 17.12.2012 16:03
Одноклеточная амеба каждые 3 часа делится на две клетки. Вывести на экран количество амеб за каждые 3 часа суток KriSSka Паскаль, Turbo Pascal, PascalABC.NET 1 10.04.2012 18:19
Помогите прибавить 3% Miyazaki Microsoft Office Excel 6 01.09.2008 13:29