webForumDet fria alternativet

Validera timestamp

PHPur PHP

10 svar · 325 visningar · startad av Skarre

Medlem sedan apr. 20012 427 inlägg
Frågan#1

Jag försöker hitta ett sätt att kolla att ett timestamp är ett giltigt datum. Jag har denna funktion som kollar vanliga datum:

function is_swedish_date($d) {
	// Rätt format?
	if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $d, $parts)) {
		// Giltigt datum?
		if (checkdate((int)$parts[2],(int)$parts[3],(int)$parts[1])) {
			return true;
		}
	}
	return false;
}

Men när jag ska hantera datum i unix-format blir det knas. Om jag kallar på funktionen enligt följande:

$date_unix = strtotime("$year-$month-$day");

if (is_swedish_date(date('Y-m-d',$startdate_unix))) {
}

så blir det fel eftersom strtotime gör om även ett ogiltigt datum till ett giltigt. 2004-02-31 blir t.ex. 2004-03-02. Visst kan jag gå runt problemet, men jag vill gärna kunna skapa en funktion för att enkelt kontrollera att en timestamp är ett giltigt datum.

Medlem sedan aug. 20002 975 inlägg
#2

Men är det ett unix_timestamp så är det ett heltal mindre än eller lika med 31^2 - 1. Då är det det du ska kolla.

I ditt exempel har du år, månad och dag. Använd då checkdate för att kolla det.

Ska det sparas som unix_timestamp, gör det isåfall efter kontrollen.

Eller är det något jag missförstått ?

Medlem sedan apr. 20012 427 inlägg
#3

Nja du har väl egentligen inte missat något. Jag tänkte bara att jag skulle skriva en funktion som kunde kolla om en timestamp är ett giltigt datum. Exemplet kanske var otydligt, men det skulle vara smidigt med en sådan funktion i vissa situationer.

Medlem sedan aug. 20002 975 inlägg
#4

Ett unix_timestamp är antalet sekunder sedan 1/1 1970 kl 00:00:00 GMT, så det man behöver kolla är att det är ett giltigt heltal, det är alltså inget datumformat.

Så länge det är ett heltal som är mellan 0 och 31^2 - 1 så är det giltigt.

Medlem sedan apr. 20012 427 inlägg
#5

Re: Validera timestamp

Jag är medveten om vad en timestamp är för någonting. :) Jag vill klura ut en funktion som kan kontrollera om en timestamp är ett giltigt datum. Se problematiken i första inlägget. Hursomhelst har jag löst det på annat sätt, men det skulle som sagt vara en användbar funktion i vissa lägen.

Skarre skrev:

Men när jag ska hantera datum i unix-format blir det knas. Om jag kallar på funktionen enligt följande:

$date_unix = strtotime("$year-$month-$day");

if (is_swedish_date(date('Y-m-d',$startdate_unix))) {
}

så blir det fel eftersom strtotime gör om även ett ogiltigt datum till ett giltigt. 2004-02-31 blir t.ex. 2004-03-02. Visst kan jag gå runt problemet, men jag vill gärna kunna skapa en funktion för att enkelt kontrollera att en timestamp är ett giltigt datum.

Medlem sedan apr. 2002830 inlägg
#6

Jag har bara en fråga. I vilka lägen skulle funktionen komma till nytta? Om du har sparat en datum som en timestamp så är ju timestampen rätt. I vissa lägen så skriver kanske en användare in ett datum själv och då blir det ju lättare att kolla så att detta är rätt än att omvandla till timestamp och sedan kolla detta...

Bara nyfiken :)

Medlem sedan apr. 20012 427 inlägg
#7

Återigen: jag vill bara veta om det är möjligt att skapa en funktion för att enkelt kontrollera att en timestamp är ett giltigt datum? :)

Medlem sedan aug. 20002 975 inlägg
#8

Och återigen, ett unix_timestamp är alltid ett giltigt datum, så länge det är ett giltigt timestamp.

Vad du kan kolla är att det är ett giltigt timestamp, alltså ett heltal mindre eller lika med 2^31-1.
Minsta tillåtna värde varierar mellan operativsystem. För windows är det t.ex. 0 (noll), för en del andra är det -2^31.

Medlem sedan apr. 20012 427 inlägg
#9

Matte, jag vet att du försöker hjälpa mig, men jag tror inte vi förstår varandra så jag tycker vi lämnar detta.

Skarre skrev:

[...] så blir det fel eftersom strtotime gör om även ett ogiltigt datum till ett giltigt. 2004-02-31 blir t.ex. 2004-03-02.

Medlem sedan mars 20007 896 inlägg
#10

Har du sett funktionen checkdate()?

Jag förstår inte riktigt vad du vill göra. Har du sedan tidigare datumet separerat i år, månad och dag - varför ska du göra om det till ett unix-timestamp?

Medlem sedan dec. 2003153 inlägg
#11

strtotime gör om även ett ogiltigt datum till ett giltigt. 2004-02-31 blir t.ex. 2004-03-02.

Men eftersom strtotime gör om det så är det ju ett giltigt datum. Om du inte är nöjd får du väl räkna ut ett timestamp själv genom att räkna hur många sekunder ditt datum är efter 1/1 1970 kl 00:00:00 GMT. Jag förstår vad du försöker göra, men jag ser ingen användning av en sådan funktion då det finns datumfunktioner att tillta. Dessutom är det väl användaren som skriver in ett knasigt datum som förlorar på det, eller?

135 ms totalt · 3 externa anrop · v20260731065814-full.9823c0c5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)