NSDateFormatter driver mig till vansinne!

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1

Jag har en indata som jag kallar publicationsDate, jag vet att det är NSString.
Jag vill omformattera denna eftersom dess formattering är icke-svensk.
t.ex: Sun, 27 Nov 2011 19:46:00 +01:00

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
	[dateFormat setDateFormat:@"yyyy-MM-dd HH:ss"];
	NSDate *date = [dateFormat dateFromString:publicationDate];
	NSLog(@"outDate: %@", date);

På detta kör jag en vanlig NSDateFormatter.
outDate blir (null).

Och jag fattar inte varför, nu har jag spenderat alldeles för mycket tid på denna lilla detalj.
AARRRGHHH!

Senast redigerat 2011-11-28 08:33
  • Medlem
  • 2011-11-28 07:58

"yyyy-MM-dd HH:ss"? Ska det inte vara "yyyy-MM-dd HH:mm:ss"?

Jo men självklart men det förändrar inte problemet. Jag har provat yyyy enbart, MM enbart. HH självt. Inget fungerar.
Jag börjar misstänka att det är indatat som NSDateFormatter inte kan hantera på rätt sätt.

Ursprungligen av Mattias Hedman:

Jo men självklart men det förändrar inte problemet. Jag har provat yyyy enbart, MM enbart. HH självt. Inget fungerar.
Jag börjar misstänka att det är indatat som NSDateFormatter inte kan hantera på rätt sätt.

Kan du inte låta operativsystemet ta hand om datumformateringarna? Dvs programmet internt jobbar med icke svenska formatet (t.ex. Sun, 27 Nov 2011 19:46:00 +01:00) och sedan formaterar operativsystemet om det användarens default datumformat (t.ex. 2011-11-27 20:46)?

Fördelen med denna metod är att då visas händelserna korrekt tid även om användaren är i en annan tidszon. Dessutom kan programmet lättare kommunicera med andra program t.ex. iCal.

  • Medlem
  • Sollentuna
  • 2011-11-28 16:43
Ursprungligen av The Real Viking:

Kan du inte låta operativsystemet ta hand om datumformateringarna? Dvs programmet internt jobbar med icke svenska formatet (t.ex. Sun, 27 Nov 2011 19:46:00 +01:00) och sedan formaterar operativsystemet om det användarens default datumformat (t.ex. 2011-11-27 20:46)?

Fördelen med denna metod är att då visas händelserna korrekt tid även om användaren är i en annan tidszon. Dessutom kan programmet lättare kommunicera med andra program t.ex. iCal.

Rätt tänkt, men lite feluttryckt. Internt jobbar ett OS inte med något format alls. Format är för läsbarhet av ett [mänskligt] öga. Ett OS jobbar alltså med tidsangivelsen i binär form. Läs gärna man-sidan för tex ctime(3) i ett godtyckligt OS.

TS säger ju bara hur utformatet ska vara, men säger inte hur informatet är. Det enda [interna] formatet på tidsangivelse som vilket (läs: *NIX-aktigt) OS som helst använder är antal sekunder sen midnatt 1:a januari 1970. TS måste alltså mellankonvertera från det ena läsbara till det andra läsbara via internrepresenterad tid.

Ursprungligen av frazze:

Rätt tänkt, men lite feluttryckt. Internt jobbar ett OS inte med något format alls. Format är för läsbarhet av ett [mänskligt] öga. Ett OS jobbar alltså med tidsangivelsen i binär form. Läs gärna man-sidan för tex ctime(3) i ett godtyckligt OS.

TS säger ju bara hur utformatet ska vara, men säger inte hur informatet är. Det enda [interna] formatet på tidsangivelse som vilket (läs: *NIX-aktigt) OS som helst använder är antal sekunder sen midnatt 1:a januari 1970. TS måste alltså mellankonvertera från det ena läsbara till det andra läsbara via internrepresenterad tid.

Tack för kommentaren!
Jag har jobbat som programmerare i php, men inte med Cocoa. Men även där är det samma sak, att man jobbar internt med sekunderna precis som i Cocoa och sedan konverterar dem till läsbart form för användaren. Det jag egentligen menade var att operativsystemet (Mac OS X/iOS) sköter konverteringen beroende på användarens inställningar (språk och nummerformat i inställningar) och läge (via GPS). Då slipper programmeraren ta hänsyn till dessa faktorer och på köpet blir ju också programmet anpassat för sommar- och vintertid. Samt att när programmet utväxlar information mellan andra program för samma användare eller olika användare så behöver man som programmerar inte heller ta hänsyn till det, då all tid har en fast referenspunkt, nämligen GMT tiden i binärform från 1:a januari 1970… (hoppas det blev rätt nu)

Jag inser nu att jag glömt säga att det handlar om iOS på en iPhone.
Det låter som en mycket bra idé men mig veterligen fixar inte iOS detta.

Formatet stämmer inte. Jag tror du måste sätta exakt samma format som strängen har. Alltså "Veckodag, Dag Månad År Tid Tidszon".

Jag tror inte det ska vara nåt kolon i tidszonen heller. Alltså bara +0100 om man är en timme före UTC.

Detta hade varit rätt format, om tidszonen inte hade haft något kolon i sig.

E, d MMM yyyy HH:mm:ss Z

detta borde väl passa bra?
Date Formatter Examples – Take 3: Date from String

det finns förmodligen en snyggare lösning, men en melodi vore att skapa NSDate-objekten med en formaterare inställd med 'läsningsformatering' (mha dateFromString:) och sedan printa dem genom en annan formaterare med formateringen ställd till det du egentligen vill ha (mha stringFromDate:).

Vad jag förstår av TS första inlägg:
Indata: Sun, 27 Nov 2011 19:46:00 +01:00
Utdata: yyyy-MM-dd HH:ss (2011-11-27 19:00)

Som någon nämner här måste formatet för indata till NSDateFormatter dateFromString anges, men det görs inte.

Info om NSDateFormatter
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html

  • Medlem
  • Göteborg
  • 2011-11-29 14:01
Ursprungligen av Mattias Hedman:

Jag har en indata som jag kallar publicationsDate, jag vet att det är NSString.
Jag vill omformattera denna eftersom dess formattering är icke-svensk.
t.ex: Sun, 27 Nov 2011 19:46:00 +01:00

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:ss"];
    NSDate *date = [dateFormat dateFromString:publicationDate];
    NSLog(@"outDate: %@", date);

På detta kör jag en vanlig NSDateFormatter.
outDate blir (null).

Och jag fattar inte varför, nu har jag spenderat alldeles för mycket tid på denna lilla detalj.
AARRRGHHH!

Som nämnts så måste du specifiera formatet på datumsträngen och sedan sätta ditt eget format.

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];

//Format på publicationDate, används för att tolka datumet rätt.   
[dateFormat setDateFormat:@"EEE, dd MM-dd ..."]; 
// Se http://unicode.org/reports/tr35/tr35-10.html#...
 
// Skapa datumet från sträng
NSDate *date = [dateFormat dateFromString:publicationDate];

// Sätt eget nytt format
[dateFormat setDateFormat:@"yyyy-MM-dd HH:ss"];

NSLog(@"outDate: %@", [date stringFromDate: date]);
// stringFromDate: används för att få de till en sträng, genom att bara logga datumet kommer du få det i ett format
// som är anpassat till "telefonens" region exempelvis USA.
1
Bevaka tråden