v2.5.2
Giriş yap

Laravel tarih ayarlaması(tarih bulma)

emreergen20
750 defa görüntülendi

Merhabalar,
Laravel projemde süre belirlenen bir alan yapmam gerek
yani abonelik(lisans vb) sistemine benzer. Kişi 41 gün diye seçtiğinde bu günden sonraki 41 gün sonrasını tarih olarak kayıt etmem gerek.
bu tarihleri nasıl bulurum
yani gün ay yıl hesabı nasıl oluyor.

mesela bu gün 5.11.2021 kullanıcı 60 gün dediğinde tarihin 4.01.2022 diye bulmam gerek bunu nasıl bulabiliyorum. hesaplama mantığı nedir.

ek olarak mesela istediğim günleri saymama olayıda olabilir.
yukarıdaki örnekden, mesela pazar günleri sayılmasın veya şu günlerde(cuma vb.) şunu yap gibi işlemleri nasıl yaparım.

kısaca en verimli nasıl bir yapı kurabilirim.

Teşekkürler.

Cevap yaz
Cevaplar (5)
makifgokce
902 gün önce

anladığım kadarıyla şöyle bişey yapmak istiyorsun.
Başlangıç tarihini ve iş gününü verip bitiş tarihini alıcaksın.

function number_of_working_days($from, $to) {
	$workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...)
	$holidayDays = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29']; # variable and fixed holidays
	// 1 Ocak, 23 Nisan, 1 Mayıs, 19 Mayıs, 15 Temmuz, 30 Ağustos, 29 Ekim

	$from = new DateTime($from);
	$interval = new DateInterval('P1D');
	$periods = new DatePeriod($from, $interval, $to * 2);

	$days = 0;
	$d = [];
	foreach ($periods as $period) {
		if (!in_array($period->format('N'), $workingDays)) continue;
		if (in_array($period->format('Y-m-d'), $holidayDays)) continue;
		if (in_array($period->format('*-m-d'), $holidayDays)) continue;
		if($days >= $to){
			break;
		}
		$d[] = $period->format('Y-m-d');
		$days++;
	}
	return $d;
}
echo "<pre>";
	print_r(number_of_working_days('2021-11-01', 30));
echo "</pre>";
emreergen20
695 gün önce

merhabalar soruyu hortlattığım için kusura bakmayın. Son cevabımdaki gibi birşey yapsam verimli olur mu?
dediğim gibi yaparsam sanki daha detaylı ve kısa bir kodlama olacağını düşündüm.
yapmak istediğim lisans lı abonelik sistemi. kişinin almış olduğu paket kapsamında aldığı andaki tarih saati unix olarak başlangıç yapacağım.(hatta paket paket kayıt ettirebilirim aldığı paketler gibi bir liste
neyse soru bu değil). altığı paketteki süre kadar da saniye ile toplayıp çıkan unix tarih saati bitiş tarihi olarak kayıt edeceğim. daha sonra her oturum açarken bu tarihi kontrol ettireceğim. eğer o anlık girdiği unix tarih saat bitiş unix verisine eşit ve büyükse abonelik bittiğini falan göstereceğim yetkileri kapatacağım
bu konu hakkında genel öneriniz de varmı?
abonelik yapını şöyle yap. yada şu kısma dikkat et genelde sorun yaşanır bunu çözersen sağlıklı olur gibi önerileriniz.
Teşekkürler iyi günler iyi çalışmalar herkese

emreergen20
902 gün önce

Cevap için teşekkür ederim. Bu yapıyı kullanacağım. peki $to için tarihi nasıl bulabilirim.
örnek:
$from : 05.11.2021
mesela kullanıcı 52 gün seçtiğinde $to alanını nasıl bulabilirim gün ay yıl $from a nasıl 52 gün ekleyip çıkan sonucu bulabilirim.

makifgokce
902 gün önce
function number_of_working_days($from, $to) {
	$workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...)
	$holidayDays = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29']; # variable and fixed holidays
	// 1 Ocak, 23 Nisan, 1 Mayıs, 19 Mayıs, 15 Temmuz, 30 Ağustos, 29 Ekim

	$from = new DateTime($from);
	$to = new DateTime($to);
	$to->modify('+1 day');
	$interval = new DateInterval('P1D');
	$periods = new DatePeriod($from, $interval, $to);

	$days = 0;
	foreach ($periods as $period) {
		if (!in_array($period->format('N'), $workingDays)) continue;
		if (in_array($period->format('Y-m-d'), $holidayDays)) continue;
		if (in_array($period->format('*-m-d'), $holidayDays)) continue;
		$days++;
	}
	return $days;
}
echo number_of_working_days('2021-01-01', '2022-01-01');
// Output: 255

$workingDays Cumartesi ve Pazar hariç tüm günleri hesapla
$holidayDays Resmi tatilleri hariç tut.
Orjinali için https://stackoverflow.com/a/19221403

emreergen20
903 gün önce

Şöyle bir şey düşündüm ama nasıl olur sizce
unix olarak anlık zamanı alıp üzerine 1 gün 86400 saniye olarak unix verisine saniyeleri toplıcam çıkan sonucu ya unix olarak yada formatı değiştirerek kullanacağım.
mesela 30 gün için şimdiki unix zaman verisine 2.592.000 sayısını toplayıp çıkan veriyi kullansam nasıl olur.