Permalänk
Medlem

Datum och tidszoner i Python

Hallå!

Jag har lite problem med Python, och hoppas att någon här kan hjälpa mig.

För att hålla databasen på www.tv-kalendern.se up to date kör jag frekvent scripts som hämtar information om sändningstider från bl.a. tv.com och tvrage.com. Dessa scripts är i dagsläget skrivna i PHP, och exekveras ett antal gånger per timma genom crontab.

Python har vart en het kandidat för nästa pröva-på språk ett tag nu för min del, och för att komma igång beslutade jag mig för att porta dessa scripts till python. Jag har fått ordning på det mesta men har fastnat vid konvertering av datum. Hoppas på hjälp.

För att förklara vad jag vill uppnå visar jag med motsvarande PHP-snutt.

// Alla tider och datum från tv.com är i tidszonen US/Eastern. // Därför sätter jag serverns lokala tidszon till detta tillfälligt. date_default_timezone_set('US/Eastern'); // Sändningstid för Prison Break, hämtat från tv.com $airs = 'Monday 8:00 PM'; // Konvertera datumet till ett unix timestamp, för att enklare kunna lagra, // ställa frågor mot, och skriva ut i andra tidszoner ('Europe/Stockholm' exempelvis). // Jag sätter 'utgångsläget' vid epokens början (1 Jan 1970) för att.. glömt. Hjälp? $airs_time = strtotime($airs, 1); // Sparas till DB osv. Slut. // --------------------------------------------------------------------- // Presenationssida: // Detta är default tidszon på servern, så denna funktion behöver egentligen inte köras. // Gör det för att förtydliga att det nu är svensk tid som gäller. : ) date_default_timezone_set('Europe/Stockholm'); // Följande skriver ut 'Tuesday 2:00 AM', vilket är sveriges motsvarighet för 'Monday 8:00 PM'. echo date('l l G:i A', $airs_time);

Edit: Bör tilläggas att det värde som sparas i $airs_time i detta fallet är 435600. Värdet ligger alltid omkring 0 (relativt sett), och kan vara både positivt och negativt. Allt från t.ex. -68400 till 534900.

Hur gör jag detta i Python?

Jag har petat lite på biblioteket pytz ("pytz - World Timezone Definitions for Python") men vet inte riktigt om, eller hur det bör användas.

Så här långt har jag kommit:

import time # Sändningstid från tv.com airs = 'Monday 08:00 PM' # Läs in till en "time tuple" t = time.strptime(airs, '%A %I:%M %p') # Plocka ut ett unix timestamp ur vår "time tuple" airs_time = time.strftime("%s", t)

Problemen är att 1) måste sätta lokala tidszonen till US/eastern först, och 2) ett veckodagsnamn och en tidpunkt är inte tillräcklig information för att kunna skapa ett fullständigt unix timestamp, så allting blir knasigt om jag inte gör som i php och definerar en utgångspunkt. Går det?

Eller kan man lösa det snyggare, mer pythonaktigt, på något annat sätt?

Visa signatur
Permalänk
Medlem

Om det är http://pytz.sourceforge.net/ du menar så står det ju ett gäng exempel på den sidan?

Citat:

The preferred way of dealing with times is to always work in UTC, converting to localtime only when generating output to be read by humans.

from datetime import datetime, timedelta from pytz import timezone utc = timezone('UTC') eastern = timezone('US/Eastern') fmt = '%Y-%m-%d %H:%M:%S %Z%z' # Jag vet inte vad datetime tar för argument, så RTFM :) utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) # loc_dt blir det lokala datumet som du ska skriva ut på sidan sen # så du bör ju sätta astimezone till Stockholm eller vad det nu var. loc_dt = utc_dt.astimezone(eastern) d = loc_dt.strftime(fmt) # d är nu = '2002-10-27 01:00:00 EST-0500' # EST-0500 delen ändras ju naturligtvis beroende på tidszon.

Permalänk
Medlem

Jag har lekt runt en hel del med exempelkoderna på pytz tidigare utan framgång, så jag har petat en del på de funktioner du använder ovan. De sköter tidszonomvandlingen galant, men det stora problemet kvarstår. Jag betonade nog lite missvisande i mitt tidigare inlägg, var rätt trött.

Problemet är att strptime() i Python tolkar uteblivna årtal och/eller annan vital information annorlunda än vad PHPs strtotime() gör.

int strtotime ( string time [, int now] )

PHPs strtotime()-funktion kan hantera det underbara 'now'-argumentet, vilket ger funktionen ett basdatum att utgå från ifall (såsom i detta fallet) information om t.ex. årtal eller månad saknas.

Om vi glömmer tidszoner för en sekund:

// Detta strtotime() anrop ger oss värdet 414000 $time = strtotime('Monday 8:00 PM', 1); // Omvandling av 414000 till en datumsträng ger oss '1970-01-05 20:00:00 Monday' echo date('Y-m-d H:i:s l', $time)."\n";

Ovanstående ger '1970-01-05 20:00:00 Monday'

import time t = time.strptime('Monday 08:00 PM', '%A %I:%M %p') print time.strftime("%Y-%m-%d %H:%M:%S %A", t)

Ovanstående ger '1900-01-01 20:00:00 Monday'

Kan man få dessa att matcha på något sätt? :-/

Visa signatur
Permalänk
Medlem

Men, vad spelar det för roll? Du använder ju uppenbarligen inte datumet?

Permalänk
Medlem

Det stämmer givetvis.. Uh..

Låste in mig på att kunna köra PHP-scripten paralellt med Python-scripten. Behöver kunna göra en jämförelse mot databasen för att se om någon ändring har skett. Vilket iofs går jättebra om alla scripts är i Python.. Aja. NVM

Visa signatur