• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

UTC Datums/Zeit-String umwandeln entsprechend der aktuellen Landeseinstellung

denio

Empire
Registriert
23.01.10
Beiträge
88
Hallo Leute,

hab da mal ne Frage :)

Ich lese einen String aus der folgendermassen aussieht

2007-06-22T20:50:21+02:00

wobei folgende Konvention gilt

JJJJ-MM-TT T StSt:MM:SecSec +/- StSt:SecSec

je nachdem ob es sich um ein + oder - handelt, sollte bei + 22:50:21 und bei - 18:50:21 angezeigt werden.

Gibt es eine bereits vorhandene Funktion, der ich den String übergeben kann, damit sie mir daraus automatisch

für z.B. Deutsch als gewählte Landeseinstellung folgende Anzeige

22.06.2007 - 22:50:21

und für z.B. USA als gewählte Landeseinstellung folgende Anzeige

06/22/2007 - 10:50:21 PM

generiert?

Hoffe ihr könnt mir helfen ;) besten Dank schonmal :)

Grüße Denio
 
Registriert
18.01.10
Beiträge
38
Hallo,

so in etwa:

Code:
NSString * OCFormattedDate (NSDate *date, NSDateFormatterStyle dateStyle, NSDateFormatterStyle timeStyle)
{
	NSArray *preferedLocalizations = [[NSBundle mainBundle] preferredLocalizations];
	NSString *preferedLocalization = [preferedLocalizations objectAtIndex:0];
	NSLocale *currentLocale = [[NSLocale alloc] initWithLocaleIdentifier:preferedLocalization];
	NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
	[formatter setLocale: currentLocale];
	[currentLocale release];
	[formatter setDateStyle:dateStyle];
	[formatter setTimeStyle:timeStyle];
	NSString *result = [formatter stringFromDate:date];
	[formatter release];
	
	return result;
}

Daraus solltest du dir was bauen können.

Gruß
Manfred
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Daraus solltest du dir was bauen können.

Gruß
Manfred

Hey Manfred,

danke für die rasche Antwort :) hab mir mal den Code angeschaut, verstehe jedoch nicht wie er aufgerufen wird :/

Handelt es sich hierbei um einen Methoden Aufruf? die Verwendung von NSString * OCF...{...} in dieser Form habe ich bisher noch nicht gesehen. Wenn es als Methode gedacht ist müsste diese doch in folgender Form vorliegen

-(NSString) OCFormattedDate (NSDate*)date NSDateFormatterStyle:....??

Hab den Code mal direkt in meine bestehenden Methode eingebunden, und dachte ich rufe ihn dort auf, der Compiler wirft jedoch folgende Fehlermeldung "error: nested functions are disabled, use -fnested-functions to re-enable"

Hoffe ich werde für die Aussage nicht gesteinigt :D (Bin Anfänger :))

Besten Dank dennoch :D
 
Registriert
18.01.10
Beiträge
38
Das ist ne C Funktion, die benutze ich ab und zu für kleine Helferlein.

Du schreibst die Funktion im einfachsten Fall in die Implementation deiner Klasse (.m Datei) oben rein, dann ist die bekannt.

Ganz großes Kino hast du dann, wenn du ein Header (.h) und eine eigene Implementation für die Funktion anlegst und includest.

Der Aufruf erfolgt dann so:

Code:
NSString *formatedDate = OCFormattedDate( [NSDate date], NSDateFormatterLongStyle, NSDateFormatterShortStyle);

Man kann ObjC und plain C munter mischen.
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Das ist ne C Funktion, die benutze ich ab und zu für kleine Helferlein.

Du schreibst die Funktion im einfachsten Fall in die Implementation deiner Klasse (.m Datei) oben rein, dann ist die bekannt.

Ganz großes Kino hast du dann, wenn du ein Header (.h) und eine eigene Implementation für die Funktion anlegst und includest.

Der Aufruf erfolgt dann so:

Code:
NSString *formatedDate = OCFormattedDate( [NSDate date], NSDateFormatterLongStyle, NSDateFormatterShortStyle);

Man kann ObjC und plain C munter mischen.

Ahhh alles klar, okay hab mir die C-Syntax/Schreibweisen bisher noch nicht angeschaut, aber gut zu wissen :).

Habs genauso gemacht und die Methode nach oben "gelegt" und läuft auch sauber (danke schon mal dafür), das aktuelle Datum wird ausgelesen und entsprechen in ein String gewandelt, den ich dann auch entsprechend darstellen kann.

Aber das löst noch nicht ganz meine Frage :). Die Darstellung der Zeit ist immer die selbe (May 10, 2010 5:04 PM) unabhängig davon ob ich nun Englisch oder z.B. Deutsch als Sprache/Landeseinstellung wähle, wäre super wenn dies automatisch gesehen würde :). Und kann ich der Methode den UTC String übergeben, so das diese den entsprechend "umwandelt"? oder muss ich den String "händisch" in ein NSDate umwandeln? und dann der Funktion übergeben :)

Danke auf jeden Fall für die Infos :D
 
Registriert
18.01.10
Beiträge
38
Füge mal ne deutsche Lokalisierung zu deinem Projekt hinzu, dann kommt auch ein deutsches Datum ;)

Hintergund: Angenommen du hast ne englische und deutsche Version deine App. Jetzt kommt ein Spanier. Bei ihm fällt dann die Lokalisierung auf Englisch zurück (default). D.h. er hätte die EN App mit spanischem Datum - sieht Käse aus. Daher holst du dir über NSBundle die preferedLocalization. Dann werden die vorhandenen Sprachen über die im System eingestellten sortiert und du bekommst auch nur die, für die dann eine komplette Lokalisierung vorhanden ist.

Den DateFormatterStyle der Systemweit eingestellt ist, kannst du dir glaub uber den NSDateFormatter besorgen (hab viel im Kopp, aber nicht alles ;) ). Dann könntest du den nehmen. Aber vorsicht, achte darauf das deine GUI designtechnisch auch mit allen möglichen Datums und Zeitlängen zurecht kommt.
 
Registriert
18.01.10
Beiträge
38
Ach so, der UTC String...

Nein, den musst du in ein NSDate wandeln. Schau mal bei NSDate nach, ob so ein Objekt direkt aus nem UTC erzeugen kannst. Glaube aber ehr nicht. Du wirst das irgendwie über ein NSCalendar machen müssen, da Cocoa wissen muss, ob du einen gregorianischen, hebräischen, chinesischen oder was für einen Kalender auch immer du haben willst. Dann wird das Datum ensprechend gewandelt.

Datumsberechnungen sind in Cocoa ein Betriebssystem für sich, aber sehr gut.
 
Registriert
18.01.10
Beiträge
38
Diese Tastatur nervt. Denk dir die fehlenden Buchstaben einfach dazu...
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Füge mal ne deutsche Lokalisierung zu deinem Projekt hinzu, dann kommt auch ein deutsches Datum ;)

Hintergund: Angenommen du hast ne englische und deutsche Version deine App. Jetzt kommt ein Spanier. Bei ihm fällt dann die Lokalisierung auf Englisch zurück (default). D.h. er hätte die EN App mit spanischem Datum - sieht Käse aus. Daher holst du dir über NSBundle die preferedLocalization. Dann werden die vorhandenen Sprachen über die im System eingestellten sortiert und du bekommst auch nur die, für die dann eine komplette Lokalisierung vorhanden ist.

Aha okay, hast recht der Ansatz ist eigentlich logisch ;) momentan ist bei mir alles noch in Englisch, werde die Lokalisierung erst am Ende durchführen ;)

Den DateFormatterStyle der Systemweit eingestellt ist, kannst du dir glaub uber den NSDateFormatter besorgen (hab viel im Kopp, aber nicht alles ;) ). Dann könntest du den nehmen. Aber vorsicht, achte darauf das deine GUI designtechnisch auch mit allen möglichen Datums und Zeitlängen zurecht kommt.

Ach so, der UTC String...

Nein, den musst du in ein NSDate wandeln. Schau mal bei NSDate nach, ob so ein Objekt direkt aus nem UTC erzeugen kannst. Glaube aber ehr nicht. Du wirst das irgendwie über ein NSCalendar machen müssen, da Cocoa wissen muss, ob du einen gregorianischen, hebräischen, chinesischen oder was für einen Kalender auch immer du haben willst. Dann wird das Datum ensprechend gewandelt.

Datumsberechnungen sind in Cocoa ein Betriebssystem für sich, aber sehr gut.


Ja die GUI, das ist ein guter Hinweis :) eigentlich sollte das kein Problem darstellen, an den Stellen wo das Datum angezeigt wird, kann der Nutzer ggf. in den Landscape-Mode wechseln, so das die Darstellung kein Problem darstellen sollte :D

Hmmm gute Frage, so weit ich weiß nutzt UTC den gregorianischen Kalender :) Such kurz -> Wiki :)

Und danke für den Link :) ich probiere es gleich mal aus und melde mich dann wieder :D

P.S. Sorry war kurz weg daher die "späte" Antwort ;)
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Hey kressevadder kann es sein, das dateWithString nicht für das iPhone / iPod Touch genutzt werden kann?

Gruss denio
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Sorry Doppelpost :/ kann gelöscht werden. Danke.
 
Registriert
18.01.10
Beiträge
38
Tatsächlich, gibts nicht auf dem iPhone. Man lernt doch nie aus.

Hier ist ein Beispiel, das ein NSDate komplett aus Komponenten zusammensetzt:

Code:
	NSDateComponents *components = [[NSDateComponents alloc] init];
	[components setHour: 12];
	[components setMinute: 30];
	
	// usw.
	
	NSCalendar *gregorian = [[NSCalendar alloc]
							 initWithCalendarIdentifier:NSGregorianCalendar];
	NSDate *date = [gregorian dateFromComponents:components];

Du müsstest dein UTC dann halt zerlegen NSString >> componentsSeperatedByString: und diese Substrings dann in int konvertieren NSString >> intValue.

Was besseres fällt mir da gerade nicht ein.

components und gregorian bitte releasen ;)
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Tatsächlich, gibts nicht auf dem iPhone. Man lernt doch nie aus.
....
Du müsstest dein UTC dann halt zerlegen NSString >> componentsSeperatedByString: und diese Substrings dann in int konvertieren NSString >> intValue.

Was besseres fällt mir da gerade nicht ein.

components und gregorian bitte releasen ;)

Hey kressevadder :)

wollte gerade "meine Variante" posten :) haha und wie es aussieht ist sie nach dem selben Grundgedanke wie deinem aufgebaut nur ein wenig "langatmiger" :p

Hier mal meine Variante :)

Code:
// Der Ursprüngliche String :"2007-02-14t09:51:06+01:00"
NSString *dateString = account.createDateAccount;
NSString *year = [dateString substringMatchedByPattern:@".*t"];
year = [year stringByReplacingOccurrencesOfString:@"t" withString:@""];

NSString *time = [dateString substringMatchedByPattern:@"t.*"];
// das +/- durch ein p/m ersetzen, da die regexmethode damit nicht klar kommt ;)
time = [time stringByReplacingOccurrencesOfString:@"t" withString:@""];
time = [time stringByReplacingOccurrencesOfString:@"+" withString:@"p"];
time = [time stringByReplacingOccurrencesOfString:@"-" withString:@"m"];

NSString *firstTime = [time substringMatchedByPattern:@".*m"];
if (firstTime.length <=0) {
	firstTime = [time substringMatchedByPattern:@".*p"];
}
firstTime = [firstTime stringByReplacingOccurrencesOfString:@"p" withString:@""];
firstTime = [firstTime stringByReplacingOccurrencesOfString:@"m" withString:@""];

NSString *secondTime = [time substringMatchedByPattern:@"m.*"];
if (secondTime.length <=0) {
	secondTime = [time substringMatchedByPattern:@"p.*"];
}
secondTime = [secondTime stringByReplacingOccurrencesOfString:@"p" withString:@"+"];
secondTime = [secondTime stringByReplacingOccurrencesOfString:@"m" withString:@"-"];
secondTime = [secondTime stringByReplacingOccurrencesOfString:@":" withString:@""];

NSLog(@"datestring:%@:\n,year:%@:\n,time:%@:\n,firstTime:%@:\n,secondTime:%@:\n,",dateString,year,time,firstTime,secondTime);

NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];

NSString *complete = [NSString stringWithFormat:@"%@ %@ %@",year,firstTime,secondTime];
NSDate *formatterDate;
formatterDate = [inputFormatter dateFromString:complete];

// Aufruf deiner Methode :) mit dem formatierten String -> NSData :)
NSString *formatedDate = OCFormattedDate( formatterDate, NSDateFormatterMediumStyle, NSDateFormatterShortStyle);

// Eine Methode um NSDate in einen String zu wandeln ;)
NSString *dateToString = [inputFormatter stringFromDate:formatterDate];
NSLog(@"date:%@", dateToString);

Hehe danke dennoch für die ganzen Tips und Hinweise :D

Ach ja die NSStrings sollte ich auch noch releasen ;)

P.S. Hey kressevadder ist jetzt ein wenig offtopic aber sag mal weißt du spontan wie ich die Breite eines "textLabels" der Row eines TableViews verändern kann, analog zur "indentationLevelForRowAtIndexPath"-Methode für detailTextLabel? :) also mit der "indentationLevelForRowAtIndexPath"-Methode kann ich zwar die Breite des textLabels auch beeinflussen, aber nicht dafür sorgen, dass die "weitere Fläche" für den Text des textLabels genutzt wird :/ sprich der darzustellende textLabel wird dennoch am Ende mit einem ... versehen obwohl genug Textvorhanden sein sollte :)
 
Zuletzt bearbeitet:

denio

Empire
Registriert
23.01.10
Beiträge
88
Also generell muss ich nur releasen, wenn ich explizit "alloc" oder "retain" aufrufe.
Das wären nicht deine NSString Objekte.

Also wäre es in meinem Fall bei den NSStrings und dem NSDate nicht nötig? sondern lediglich bei den "inputFormatter"? bisher ging ich immer davon aus, das ich jeden Speicher den ich wie auch immer belege freigeben muss?

Gruss denio :)
 

denio

Empire
Registriert
23.01.10
Beiträge
88
Nein, weil du Factory Methoden aufrufst:
http://wiki.osxentwicklerforum.de/doku.php?id=wiki:convenience_allocator

Übrigens solltest du dir dringend das Speichermanagement anschauen:
http://wiki.osxentwicklerforum.de/doku.php?id=wiki:speicherverwaltung

Überall wo du alloc, retain, copy Nachrichten verschickst, musst du manuell releasen.

Hey Jamsven Danke :) das erklärt warum ich immer wieder NSStrings nicht releasen konnte und dies ständig zu Abstützen führte. die jedoch immer erst später auftauchten und das Debugging entsprechend lästig war :)

Die WikiInfos sind super :) wühle mich gerade durch die Artikel :D