Delphi Can
tarih sorunsalı ! - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: tarih sorunsalı ! (/showthread.php?tid=3407)



tarih sorunsalı ! - forumcuali - 06-03-2019

Nedir bu tarihlerden çektiğim, yok ona çevir yoklmadı format değiştir maskededit zaten bi problem derken buhranlar içinde google amcaya dedim ki:

 " bitsin artık bu tarih işkencesi" ...

verdiği cevabı ekleyip çıkarmadan aynen iletiyorum:

y6vLmy.jpg
İlk çıkan üç sonuç @Tuğrul HELVACI hocamı işaret ediyor.

çözüm burnumun dibindeymiş -tabiri caizsse-
şaşırdım desem : Kim olacaktı ya
şaşırmadım desem : ayıp olacak

evet yıllar yıllar evvel zaten hocam sağolsun çoktan halletmiş mevzuyu. Bende meseleyi sevdiğim,saydığım bi insanın elinden halletmenin verdiği huzurla, arkadaşlarla paylaşıyım dedim.(hocam izin almadım inşaallah darılmazsınız)
Aynen hali hazırda devam ettiğim projeme ekleyiverdim....Smile))


@Tuğrul HELVACI hocamdan alıntı:
kaynak: http://www.tugrulhelvaci.com/?p=209

 Herhangi bir TDateTime verisini tutan bir veribilinçli denetimde aşağıdaki şekilde girişler yapabildiğinizi düşünün:
+5g -> Mevcut tarihten 5 gün sonrası
+5a -> Mevcut tarihten 5 ay sonrası
+5y -> Mevcut tarihten 5 yıl sonrası
+5s -> Mevcut tarihten 5 saat sonrası
+5dk-> Mevcut tarihten 5 dakika sonrası
+5sn-> Mevcut tarihten 5 saniye sonrası
+5g* -> Bugünden 5 gün sonrası
+5a* -> Bugünden 5 ay sonrası
+5y* -> Bugünden 5 yıl sonrası
+5s* -> Bugünden 5 saat sonrası
+5dk* -> Bugünden 5 dakika sonrası
+5sn* -> Bugünden 5 saniye sonrası
bugün-> Bugünün tarihi
bugun-> Bugünün tarihi
şimdi -> Bugünün tarihi
simdi -> Bugünün tarihi
today -> Bugünün tarihi
now -> Bugünün tarihi
yarın -> Yarının tarihi
yarin -> Yarının tarihi
tomorrow -> Yarının tarihi
dün -> Dün
dun -> Dün
yesterday -> Dün
23052009 -> 23/05/2009
230509 -> 23/05/2009
23/05 -> 23/05/2009
23.05 -> 23/05/2009
23.05/2009 -> 23/05/2009
23/05.2009 -> 23/05/2009
23.05/09 -> 23/05/2009
23/05.09 -> 23/05/2009
Tabii yukarıda + olarak verdiğim örneklerin – olarak da çalışacağını söylemeye gerek duymuyorum.Sanırım yazdığımız programların kullanıcıları bu durumdan son derece memnun olacaklardır. Ayrıca belki bazı hesaplamalarda kodsal anlamda bizimde işimize yarayacaktır. Bu kadar kêlamın ardından arzu ederseniz bu sihirli metodu sizlerin beğenisine sunayım:


function ConvertToDateTime(const AOldValue, AValue : String) : TDateTime;
type
TSeperator = record
  AlphaSection  : String;
  NumSection    : Integer;
  UseCurrentDate: Boolean;
end;

function Parse(const Value : String) : TSeperator;
var
  iCounter  : Integer;
  sNum,
  sValue    : String;

  TAlpha    : set of Char; //'a'..'z';
  TNums     : set of Char; //'0'..'9';
begin
  sNum := '';
  sValue := LowerCase(Value);

  TAlpha := ['a'..'z'];
  TNums  := ['0'..'9'];

  Result.AlphaSection := '';
  Result.NumSection := 0;
  Result.UseCurrentDate := false;

  for iCounter := 1 to Length(sValue) do
  begin
    if sValue[iCounter] in TAlpha then Result.AlphaSection := Result.AlphaSection + sValue[iCounter];
    if sValue[iCounter] in TNums  then sNum := sNum + sValue[iCounter];
    if sValue[iCounter] = '*' then Result.UseCurrentDate := true;
  end;

  if sNum <> '' then
    Result.NumSection := StrToIntDef(sNum, 0);
end;

  var
  sVal        : String;
  iMultiplier : Integer;
  OldDate     : TDateTime;
  Separator   : TSeperator;
begin
  Result := 0;
  iMultiplier := 1;

  OldDate := Now;

  if Trim(AOldValue) <> '' then
    OldDate := StrToDateTimeDef(Trim(AOldValue), Now);

  sVal := Trim(AValue);
  sVal := StringReplace(sVal, 'Ü', 'ü', [rfReplaceAll]);
  sVal := StringReplace(sVal, 'Ş', 'ş', [rfReplaceAll]);
  sVal := StringReplace(sVal, 'İ', 'i', [rfReplaceAll]);
  sVal := LowerCase(sVal);

  sVal := StringReplace(sVal, '.', DateSeparator, [rfReplaceAll]);
  sVal := StringReplace(sVal, ',', DateSeparator, [rfReplaceAll]);
  sVal := StringReplace(sVal, '/', DateSeparator, [rfReplaceAll]);

  if Pos(DateSeparator, sVal) <> 0 then
  begin
    try
      Result := StrToDate(sVal);
      Exit;
    except
    end;
  end;

  if Length(sVal) = 0 then Exit;

  if  (sVal = 'bugün') or
      (sVal = 'bugun') or
      (sVal = 'şimdi') or
      (sVal = 'simdi') or
      (sVal = 'today') or
      (sVal = 'now') then
  begin
    Result := Now;
    Exit;
  end;

  if  (sVal = 'yarın') or
      (sVal = 'yarin') or
      (sVal = 'tomorrow') then
  begin
    Result := Now + 1;
    Exit;
  end;

  if  (sVal = 'dün') or
      (sVal = 'dun') or
      (sVal = 'yesterday') then
  begin
    Result := Now - 1;
    Exit;
  end;

  if sVal[1] = '-' then iMultiplier := -1;

  if (sVal[1] in ['-', '+']) and (Length(sVal) >= 3) then
  begin
    Delete(sVal, 1, 1); // -, +

    Separator := Parse(sVal);

    if Separator.AlphaSection = '' then Separator.AlphaSection := 'g';

    if Separator.AlphaSection = 'g' then // Gün
    begin
      if Separator.UseCurrentDate
      then Result := IncDay(Now, iMultiplier * Separator.NumSection)
      else Result := IncDay(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;

    if Separator.AlphaSection = 'a' then // Ay
    begin
      if Separator.UseCurrentDate
      then Result := IncMonth(Now, iMultiplier * Separator.NumSection)
      else Result := IncMonth(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;

    if Separator.AlphaSection = 'y' then // Yıl
    begin
      if Separator.UseCurrentDate
      then Result := IncYear(Now, iMultiplier * Separator.NumSection)
      else Result := IncYear(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;

    if Separator.AlphaSection = 's' then // Saat
    begin
      if Separator.UseCurrentDate
      then Result := IncHour(Now, iMultiplier * Separator.NumSection)
      else Result := IncHour(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;

    if Separator.AlphaSection = 'dk' then // Dakika
    begin
      if Separator.UseCurrentDate
      then Result := IncMinute(Now, iMultiplier * Separator.NumSection)
      else Result := IncMinute(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;

    if Separator.AlphaSection = 'sn' then // Saniye
    begin
      if Separator.UseCurrentDate
      then Result := IncSecond(Now, iMultiplier * Separator.NumSection)
      else Result := IncSecond(OldDate, iMultiplier * Separator.NumSection);

      Exit;
    end;
  end;

  if (Length(sVal) mod 2) <> 0 then sVal := '0' + sVal;

  if ( Length(sVal) = 6 ) or ( Length(sVal) = 8 ) then // 23052009 , 230509 gibi tarih girişleri
  begin
    Insert( DateSeparator, sVal, 5 );
    Insert( DateSeparator, sVal, 3 );

    TryStrToDate(sVal, Result);
    Exit;
  end;

  raise Exception.Create('Tarih/Saat dönüşümlerinde hata.!');
end;


Şimdi yeni bir uygulama açıyoruz ve formumuzun üzerine bir grid atıyoruz. Veritabanı bağlantılarını ayarladıktan sonra içinde tarihsel bir veri ihtiva eden bir sql sonucunu yada bir tabloyu TDataSet türevli bir nesneye atıyoruz. Ardından tarih alanımızı o nesneye ekliyoruz.(TDataSet türevi component üzerinde Fields Editor/Add All Fields).

Ardından TDateTimeField türündeki field’ın olaylarından OnSetText‘e aşağıdaki gibi bir kod yazacağız;

procedure TForm1.ClientDataSet1SaleDateSetText(Sender: TField;
const Text: String);
begin
  try
    Sender.AsDateTime := ConvertToDateTime(Sender.AsString, Text);
  except
    Sender.AsString := Text;
  end;
end;

Şimdi programı çalıştıralım ve grid yada bir TDBEdit üzerinden denemelerimizi yapalım. İyi eğlenceler


Cvp: tarih sorunsalı ! - Tuğrul HELVACI - 06-03-2019

İşinize yaradığına memnun oldum, zaten amacımız da bu idi ve bu olacak inşallah. Smile


tarih sorunsalı ! - COMMANDX - 13-01-2022

Şöyle bir fonksiyon yazdım Biraz acemice ama işimi görüyor biggrin.png


uses DateUtils;
VAR
YIL,AY,GUN,SAAT,DAK,SAN,SAL,GUNISIM:STRING;

FUNCTION Tarix (TARIH:TDATETIME):STRING;
var
 myDate : TDateTime;
 myYear, myMonth, myDay,Hour,Minute,Second,Millisecond : Word;
begin
 myDate := TARIH;
//  myDate := IncMonth(myDate);
DecodeDateTime(myDate, myYear, myMonth, myDay,HOUR,MINUTE,SECOND,MILLISECOND);
//  ShowMessage('myDate now = '+DateToStr(myDate));
YIL:=IntToStr(myYear);
AY:=IntToStr(myMonth);
GUN:=IntToStr(myDay);
SAAT:=INTTOSTR(HOUR);
DAK:=INTTOSTR(MINUTE);
SAN:=INTTOSTR(SECOND);
SAL:=INTTOSTR(MILLISECOND);
GUNISIM:=(LongDayNames[dayofweek(MYDate)]);

//---- Ayın Başındaki Sıfırları Düzenle----
IF LENGTH(INTTOSTR(MYMONTH))=1 THEN BEGIN
AY:='0'+INTTOSTR(MYMONTH);
END;
//----Gün onluk Basamak Düzenlemesi---
IF Length(INTTOSTR(MYDAY))=1 THEN BEGIN
GUN:='0'+INTTOSTR(MYDAY);
END;
//-------------Saat Başındaki Sıfırları Düzenle---------
IF Length(INTTOSTR(HOUR))=1 THEN BEGIN
SAAT:='0'+INTTOSTR(HOUR);
END;
//---------Dakika Başındaki Sıfırları Düzenle---------------
IF Length(INTTOSTR(MINUTE))=1 THEN BEGIN
DAK:='0'+INTTOSTR(MINUTE);
END;
End;


// kullanımı
procedure TForm1.Button1Click(Sender: TObject);
begin
TARIX(NOW);
EDIT1.Text:=YIL;
EDIT2.Text:=AY;
EDIT3.Text:=GUN;
EDIT4.Text:=SAAT;
EDIT5.Text:=DAK;
EDIT6.Text:=SAN;
EDIT7.Text:=SAL;
EDIT8.Text:=GUNISIM;
EDIT9.Text:=DATETIMETOSTR(NOW);
end;