Doğru Tarih Saate ulaşma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Bay_Y
Üye
Mesajlar: 48
Kayıt: 10 Mar 2014 11:12

Doğru Tarih Saate ulaşma

Mesaj gönderen Bay_Y » 09 Eki 2017 02:06

Öncelikle herkese kolaylıklar diliyorum.

Yapılacak olan programda kayıt tarih ve saatinin doğru olarak kaydedilebilmesi için bir önerisi olan var mı ?
Anlatmak istediğim kullanıcı tarih ve saati değiştirerek farklı tarihlere kayıt yapamaması için şu an için doğru saati bir yerden okuyabilir miyiz ?
Mesela bios veya belki internet ama internet olmayabilir belki bios daha sağlam olur ,

herkese teşekkürler.

Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 595
Kayıt: 01 Nis 2008 04:38
Konum: İstanbul

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen adelphiforumz » 09 Eki 2017 02:50

sql server kullanıyorsan Select getdate() as zaman diyebilirsin
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana

mkysoft
Kıdemli Üye
Mesajlar: 2812
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen mkysoft » 09 Eki 2017 02:50

Bu alanları DB tarafında doldurabilirsiniz. Eğer DB'de aynı makinada ise, internet bağlantısı üzerinden belli aralıklarlarla tarihin düzgün olup olmadığını kontrol etmeniz mümkün. Jedi içinde hazır bir NTP componenti vardı diye hatırlıyorum.

Bay_Y
Üye
Mesajlar: 48
Kayıt: 10 Mar 2014 11:12

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen Bay_Y » 09 Eki 2017 03:31

çok teşekkürler , aslında her ikiside var SQl kullanmayı düşünüyorum kendi bilgisayarında olacağı için sanırım onunda çok bir fayası olmayacak , internet biraz sıkıntılı ne kadar süre olur olmaz emin değilim fikirlerinizi paylaştığınız için tekrar teşekkür ediyorum.

Kullanıcı avatarı
csunguray
Üye
Mesajlar: 820
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen csunguray » 09 Eki 2017 05:40

Aşağıdaki fonksiyonlar ile tarih ve saati MS SQL Server sunucusundan çekebilirsiniz.

Kod: Tümünü seç

function TForm1.ServerNow: TDateTime;
var
  Q1: TADOQuery;
begin
  Q1 := TADOQuery.Create(Self);
  try
    Q1.Connection := AppConnection;
    Q1.SQL.Text := 'SELECT GETDATE() AS CurrentDateTime';
    Q1.Open;
    Result := Q1.FieldByName('CurrentDateTime').Value;
    Q1.Close;
  finally
    Q1.Free;
  end;
end;

function TForm1.ServerDate: TDateTime;
begin
  Result := Trunc(ServerNow);
end;

function TForm1.ServerTime: TDateTime;
begin
  Result := Frac(ServerNow);
end;

C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)

Bay_Y
Üye
Mesajlar: 48
Kayıt: 10 Mar 2014 11:12

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen Bay_Y » 11 Eki 2017 11:37

csunguray kardeşim teşekkür ederim.
Ama local de çalışacak SQl ve Program aynı bilgisayarda kurulu olacak buna rağmen bilgisayar saati farklı ise yinede işe yarar mı ? tarihi bilgisayardan çekmiyor mu ?

Kullanıcı avatarı
csunguray
Üye
Mesajlar: 820
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen csunguray » 11 Eki 2017 01:39

Bay_Y yazdı:
11 Eki 2017 11:37
csunguray kardeşim teşekkür ederim.
Ama local de çalışacak SQl ve Program aynı bilgisayarda kurulu olacak buna rağmen bilgisayar saati farklı ise yinede işe yarar mı ? tarihi bilgisayardan çekmiyor mu ?
Program eğer lokalde çalışacaksa ve kullanıcının administrator yetkisi varsa kullanıcı her şeyi yapabilir anlamına gelir. Bunu engellemek için şöyle önlemler geliyor aklıma:

1. administrator harici normal bir kullanıcı oluşturun, programı kullanan kişi oradan giriş yapsın.

2. Registry'en veya güvenlik ilkelerinden tarih/saatin değiştirilmesini engelleyebilirsiniz. (https://www.sevenforums.com/tutorials/1 ... nging.html )

3. Yeni bir kayıt eklerken kayıt tarih/saatini kaydeder, sonraki kayıtlarda bundan daha eski bir kayıt girilmesini engellersiniz.
En son csunguray tarafından 11 Eki 2017 02:29 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)

ertank
Üye
Mesajlar: 833
Kayıt: 11 Eyl 2015 11:45

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen ertank » 11 Eki 2017 01:52

Merhaba,

@csunguray cevabına ek olarak aşağıdaki bağlantıdaki ticari kullanımı ücretsiz sistem saatini doğru tutmaya yarayan uygulamayı inceleyebilirsiniz.
http://www.timesynctool.com/

true_false
Üye
Mesajlar: 394
Kayıt: 22 Tem 2004 01:03
Konum: sıkıntı çekmişlere yakın bi yerden

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen true_false » 12 Eki 2017 08:46

https://timezonedb.com rest apisi var. kullanımıda basit
bedava versiyonundan saniyede bir sorgu çekebilirsiniz.
type
Tform1 = class(Tform)

mehmetantalya
Üye
Mesajlar: 172
Kayıt: 30 Eyl 2013 09:17

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen mehmetantalya » 12 Eki 2017 01:58

csunguray in 3. onerisinde oldugu gibi yeni kayit girislerinde o anki tarih ve saat bilgisini bir alana kaydedersiniz. Sonra her islemde bu tarih ve saatle karsilastirma yaparsiniz. Eger tarih son kayitli tarihten kucukse isleme izin vermezsiniz. Değilse islemi yaptirir ve son islem tarihini bu ana ayarlarsaniz.
Ben de bu yontemi kullaniyorum bir projemde.

Bay_Y
Üye
Mesajlar: 48
Kayıt: 10 Mar 2014 11:12

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen Bay_Y » 13 Eki 2017 04:00

Herkese çok teşekkür ediyorum , Sağolun hepside uygulabilir mantıklı öneriler aslında sadece internet de zaman zaman sıkıntı olabilieceği için sanki son kaydedilen tarihi kontrol etmek daha mantıklı olabiliecek gibi.

Herkese çok teşekkür ediyorum. Sağolun.

ertank
Üye
Mesajlar: 833
Kayıt: 11 Eyl 2015 11:45

Re: Doğru Tarih Saate ulaşma

Mesaj gönderen ertank » 14 Eki 2017 11:27

Eğer database ve uygulama aynı sistemde çalışıyor ise ve tarih saatin hatalı olabileceğine dair endişe var ise daha önce kaydedilen verilerin doğruluğu da sorgulanabilir. Diğer bir deyişle daha önce kaydedilen bilgiler de hatalı olabilir. Bu anlamda önceki kayıt zamanları ile kıyaslama yapma mantığı da hatalı sonuçlar doğurabilir.

Eğer tamamen doğru bilgi olması isteniliyor ise aşağıdaki gibi bir kod kullanılabilir. Hata oluşması halinde kayıt işlemine izin verilmez ise database içinde hatalı tarih içeren kayıt olmayacaktır.

Kod: Tümünü seç

uses
  IdBaseComponent,
  IdComponent,
  IdUDPBase,
  IdUDPClient,
  IdSNTP,
  DateUtils;
  
function GetInternetDateTime(out ADate: TDateTime; const DatePart: Boolean = False): Boolean;
var
  TimeServer: TIdSNTP;
begin
  TimeServer := TIdSNTP.Create(nil);
  try
    TimeServer.Host           := 'pool.ntp.org';
    // İsteğe bağlı olarak aşağıdaki 2 saniyelik zaman aşımı süresi değiştirilebilir.
    TimeServer.ReceiveTimeout := 2000;
    try
      ADate := TimeServer.DateTime;
      if DatePart then ADate := DateOf(ADate);
    except
      Exit(False);
    end;
  finally
    TimeServer.Free();
  end;

  Result := True;
end;
Kullanımı aşağıdaki gibi olacaktır.

Kod: Tümünü seç

var
  DogruTarih: TDateTime;
begin
{ Database kaydı girilmeden önce aşağıdaki yöntemlerden biri ile kontrol yapılarak duruma göre kayıt girişine engel olunabilir. }

  // Sadece tarih bilgisi almak için
  if not GetInternetDateTime(DogruTarih, True) then Exit();
  
  // Tarih ve saat bilgisi birlikte olacak şekilde
  if not GetInternetDateTime(DogruTarih) then Exit();  
  
  // Tarih ve saat bilgisi birlikte olacak şekilde alternatif kullanım
  if not GetInternetDateTime(DogruTarih, False) then Exit();  
end;
Tabi yukarıdaki kodun çalışması için internet bağlantısı gerekecektir. İnternet bağlantısı olmadığı durumlarda veya zaman sunucusuna ulaşılamadığı durumlarda veya 2 saniye içinde cevap gelmediği zaman internet saati okunamayacak ve database kayıt girişine izin verilmemiş olacaktır.

Benzer bir yöntem olarak; uygulama ilk çalıştırıldığı zaman yukarıdaki yöntem ile doğru saat öğrenilerek PC sistem saati öğrenilen doğru saate ayarlanabilir. Ancak uzun süre açık kalacak uygulamalar için bir süre sonra PC saatinin yine hatalı bir değer içermesi olasıdır.

Sistem saatini güncellemek için aşağıdaki gibi bir kod kullanılabilir.

Kod: Tümünü seç

uses
  Winapi.Windows;
  
function SetSystemDateTime(const ADateTime: TDateTime): Boolean;
var 
  SystemTime: TSystemTime; 
begin 
  DateTimeToSystemTime(ADateTime, SystemTime); 
  Result := SetLocalTime(SystemTime); 
  if Result then PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;
Alternatif karma bir yöntem olarak; uygulama ilk açıldığı zaman internetten doğru saati öğrenip sistem saatini günceller. Belirli zaman aralıklarında internet saati okunur, sistem saati ile önemli bir farkı olup olmadığına göre sistem saati güncellemesi tekrarlanabilir.

Sonunda yöntem saat doğruluğunun ne derece öncelikli olduğuna göre belirlenecektir.

Cevapla