Veckonummer från UNIX-time? LÖST

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Veckonummer från UNIX-time? LÖST

Inlägg av Marta »

Känner någon av Er till var jag kan hitta en färdig algoritm för att få fram det svenska veckonumret från "UNIX-time"? Inga flyttal eller annat krångel. Skall köras på en PIC.

Även en algoritm som talar om ifall det råder svensk sommartid är av intresse.


Det finns redan rutiner som separerar upp UNIX-time i HH:MM:SS, YY:MM:DD samt veckodag. Allt i form av binära tal. Dessa är givetvis tillgängliga att ingå i ovanstående uppgifter.
Senast redigerad av Marta 21 oktober 2008, 17:27:28, redigerad totalt 1 gång.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Inlägg av blueint »

Ger veckonummer på FreeBSD:
date +%V

Torde gå att fiska upp algoritmen ur källkoden.
Användarvisningsbild
hcb
Moderator
Inlägg: 5983
Blev medlem: 23 februari 2007, 21:44:50
Skype: hcbecker
Ort: Lystrup / Uppsala
Kontakt:

Inlägg av hcb »

Intressant.
`date +%V' ger på min Mac
38
medan Apples iCal påstår att veckonumret är 37 ...

Dags att skicka in en buggrapport om ingen annan gjort det :)

Tack för tipset, förresten!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

hcb: det finns olika veckonumreringsstandard har jag för mig... testa date +%U också
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Ha inte för Dig, det ÄR så att det finns olika system. Det var därför jag speciellt skrev att det skulle vara svenskt veckonummer. Här i Sveriige är det någon ISO-standard som används, kommer inte ihåg dess nummer.
Användarvisningsbild
mrOh
EF Sponsor
Inlägg: 541
Blev medlem: 6 mars 2005, 13:54:31
Ort: Bromma

Inlägg av mrOh »

Linux date och BSD date är olika och har inte samma syntax.

Edit: Men bara för det så funkade 'date +%U' i båda varianterna
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

GNU date och BSD date måste det väl vara isf? För GNU date finns hursomhelst %U och %V för veckor, som börjar med söndag resp. måndag.

Marta: Svenska ISO 8601:1998-veckor börjar på måndagar, har jag för mig. :wink:
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Ja, veckan börjar på måndagar. Numreringen börjar på den vecka som innehåller årets första torsdag, som är första dagen efter en halv vecka. Därigenom kan förra årets numrering fortsätta in på nästa år och samma vecka kan aldrig få två olika nummer. Ett från det nya året och ett från det gamla. Det inträffar i de system som används i vissa länder när vecka och år inte byter på samma dag.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Numreringen börjar på den vecka som innehåller årets första torsdag,...

Och om 1-jan är en torsdag, så kommer 29,30 och 31/12 från föregående
år att tillhöra "vecka 1", kan vara lite förvillande... :-)
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Tycker det är enklast att se det som att den vecka som innehåller 4 januari alltid är vecka 1.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Inlägg av blueint »

FreeBSD:
/bin/date
Wed Sep 17 01:54:16 CEST 2008
/bin/date "+%V %U"
38 37

http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/date/ - date.c
if (*argv && **argv == '+') {
format = *argv + 1;
++argv;
}
(void)strftime(buf, sizeof(buf), format, &lt);

strftime -- format date and time
Standard C Library (libc, -lc)

%U is replaced by the week number of the year (Sunday as the first day
of the week) as a decimal number (00-53).
%V is replaced by the week number of the year (Monday as the first day
of the week) as a decimal number (01-53). If the week containing
January 1 has four or more days in the new year, then it is week 1;
otherwise it is the last week of the previous year, and the next
week is week 1.

http://www.freebsd.org/cgi/cvsweb.cgi/s ... c/stdtime/ - strftime.c
case 'V': /* ISO 8601 week number */
.
.

Bara att läsa.. ;)
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

Finns lite utförligare om ISO 8601 på wikipedia: http://en.wikipedia.org/wiki/ISO_8601#Week_dates
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Dags att gå vidare med veckonumren.

Egentligen väldigt lätt om det inte vore för 6 datum, 29/12 till 3/1...

Innan jag lägger ner mer arbete på detta, finns det någon färdig algoritm att hämta som bygger på heltal?

Om inte kanske någon har en URL där man kan slå fram veckonummer för olika årtal? Detta för att ag skulle vilja veta sista veckonumret i dessa år, samt i året före, alla 2000-någonting, för att kunna validera en egen algoritm.

01 02 03 05 06 09 10 00 04 08 12 16 20 24
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Den här koden har jag i min dörrlogger för justering av sommartid.
Är säker på att jag skrev beräkning för veckonummer, men den hittar jag inte just nu.

Kod: Markera allt

			// Summertime, if sunday after 24 march it´s the last sunday in march, adjust for summertime
			if ( timedate->clkH == 2 && timedate->dateD > 24 && timedate->dateM == M_MAR && timedate->dayOfWeek == D_SUN ) {
				timedate->clkH = 3;	
			
			// Normal time, if sunday after 24 october it´s the last sunday in october
			} else if ( timedate->clkH == 3 && timedate->dateD > 24 && timedate->dateM == M_OCT && timedate->dayOfWeek == D_SUN ) {
				if ( !timedate->status.bits.normTimeAdj ) {
					timedate->clkH = 2;	
					timedate->status.bits.normTimeAdj = 1;
				} else {
					timedate->status.bits.normTimeAdj = 0;
				}
			}
Skriv svar