NSDate erhalten Jahr / Monat / Tag
-
02-10-2019 - |
Frage
Wie kann ich das Jahr / Monat / Tag eines NSDate
Objekt erhalten, da keine weiteren Informationen? Ich weiß, dass ich dies wahrscheinlich mit etwas ähnlichem wie dies tun könnte:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Aber das scheint für etwas so einfach eine ganze Menge Ärger zu sein, wie ein NSDate
Jahr / Monat / Tag zu bekommen. Gibt es eine andere Lösung?
Lösung
Da dies anscheinend meine populärste Antwort ist, ich werde zu bearbeiten versuchen, es ein wenig mehr Informationen Bit enthalten.
Trotz seines Namens NSDate
an und für sich einen Punkt in Maschinenzeit einfach Marken, kein Datum. Es gibt keinen Zusammenhang zwischen dem Zeitpunkt von einer NSDate
angegeben und einem Jahr, Monat oder Tag. Dafür müssen Sie in einem Kalender angezeigt. Alle gegebenen Zeitpunkt kehrt verschiedene aktuelle Informationen basieren auf, was Kalender Sie befinden sich in der (Daten sind nicht das gleiche in beiden den gregorianischen und jüdischen Kalender, zum Beispiel), und während der Gregorianische Kalender ist die am weitesten verbreitete Kalender in der Welt - ich gehe davon aus - wir sind ein wenig voreingenommen, dass NSDate
sollte es immer verwenden. NSDate
, zum Glück, ist weit mehr parteiübergreif.
Getting Datum und Zeit ist zu haben, durch NSCalendar
passieren, wie Sie erwähnt haben, aber es gibt einen einfacheren Weg, es zu tun:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Das erzeugt ein NSDateComponents
Objekt mit Tag, Monat und Jahr aus dem aktuellen System-Kalender für den aktuellen Tag. (. Hinweis: das ist nicht unbedingt die aktuelle Benutzer angegebenen Kalender, nur die Standard-System ein)
Natürlich, wenn Sie einen anderen Kalender oder das Datum verwenden, können Sie leicht ändern. Eine Liste der verfügbaren Kalender und Kalender-Einheiten können in der NSCalendar
Klassenreferenz . Mehr Informationen über NSDateComponents
in der NSDateComponents
Klassenreferenz .
Als Referenz aus dem NSDateComponents
einzelnen Komponenten Zugriff ist ziemlich einfach:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Sie müssen nur darauf achten: NSDateComponents
nicht enthalten gültige Informationen für alle Felder, die Sie wünschen, wenn Sie sie mit, dass gültige Informationen erzeugt (das heißt Anfrage NSCalendar
diese Informationen mit NSCalendarUnit
s zur Verfügung zu stellen). NSDateComponents
enthalten keine Referenzinformationen an und für sich - sie sind nur einfache Strukturen, die Zahlen für Sie den Zugriff halten. Wenn Sie wollen auch eine Ära erhalten, zum Beispiel aus NSDateComponents
, müssen Sie den Generator Methode von NSCalendar
mit der NSCalendarUnitEra
Flagge ernähren.
Andere Tipps
Sie können separate Komponente eines NSDate mit NSDateFormatter bekommen:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];
Wenn Sie Monat Zahl zu erhalten, statt Abkürzung, die Verwendung „MM“. Wenn Sie möchten, ganze Zahlen erhalten, verwenden [myDayString intValue];
Just Itai ist ausgezeichnet (und arbeiten!) Code neu zu formulieren, ist hier, was eine Probe Hilfsklasse wie, aussehen würde die Jahr Wert eines bestimmten NSDate Variable zurück.
Wie Sie sehen können, ist es einfach genug, um diesen Code zu ändern Monat oder Tag zu bekommen.
+(int)getYear:(NSDate*)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
return year;
}
(Ich kann nicht glauben, dass wir mit unseren eigenen Grunde iOS Datumsfunktionen wie dies zu schreiben, im Jahr 2013 ...)
Eine andere Sache. Sie überhaupt nicht verwenden
XCode wird gerne einen solchen Code akzeptieren (ohne Fehler oder Warnungen), aber ihre Ergebnisse sind eine Lotterie. Sie müssen verwenden, um die Funktion "Vergleichen" NSDates vergleichen:
if ([date1 compare:date2] == NSOrderedDescending) {
// date1 is greater than date2
}
In Swift 2.0:
let date = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let components = calendar.components([.Month, .Day], fromDate: date)
let (month, day) = (components.month, components.day)
Ich schreibe diese Antwort, weil es der einzige Ansatz ist, die nicht geben Sie OPTIONALS zurück von NSDateComponent
Variablen und / oder Kraft dieser Variablen (auch für Swift 3) auspacken.
Swift 3
let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)
Swift 2
let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)
Bonus Swift 3 Spaß-Version
let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)
Neu in iOS 8
ObjC
NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];
Swift
let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)
Wenn Sie iOS zielen 8+ Sie die neuen NSCalendar
Bequemlichkeit Methoden verwenden können, dies in einem prägnanten Format zu erreichen.
Erstellen Sie zunächst eine NSCalendar
und verwenden, was NSDate
erforderlich ist.
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
Sie können Komponenten einzeln über component:fromDate:
extrahieren
NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
Oder, noch kurz und bündig, Verwendung NSInteger
Zeiger über getEra:year:month:day:fromDate:
NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];
Für weitere Informationen und Beispiele Besuche NSDate Manipulation leicht gemacht in iOS 8 . Haftungsausschluss, schrieb ich an den Pfosten.
Wie von iOS 8.0 (und OS X 10) können Sie verwenden, um die Komponente Methode zur Vereinfachung ein einzelnes Datum Komponente immer etwa so:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
Wenn die Dinge einfacher machen und hoffentlich wird diese effizient umgesetzt werden.
Wenn Sie die einzelnen NSDateComponents von NSDate erhalten möchten, würden Sie auf jeden Fall die Lösung von Itai Ferber vorgeschlagen müssen. Aber wenn Sie wollen direkt gehen von NSDate zu einem NSString, können Sie NSDateFormatter .
NSDate *currDate = [NSDate date];
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"%d/%d/%d", day, month, year);
Hier ist die Lösung in Swift:
let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
// Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)
var (year, month, date) = (components.year, components.month, components.day)
Versuchen Sie dies. . .
Code-Snippet:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
Es gibt aktuelle Jahr, Monat, Datum
Versuchen Sie Folgendes:
NSString *birthday = @"06/15/1977";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSDate *date = [formatter dateFromString:birthday];
if(date!=nil) {
NSInteger age = [date timeIntervalSinceNow]/31556926;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
}
[formatter release];
Swift 2.x
extension NSDate {
func currentDateInDayMonthYear() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "d LLLL yyyy"
return dateFormatter.stringFromDate(self)
}
}
Sie können es als verwenden
NSDate().currentDateInDayMonthYear()
Output
6 March 2016
Swift
Einfacher Weg, um alle Elemente des Datums als optionales String zu erhalten.
extension Date {
// Year
var currentYear: String? {
return getDateComponent(dateFormat: "yy")
//return getDateComponent(dateFormat: "yyyy")
}
// Month
var currentMonth: String? {
return getDateComponent(dateFormat: "M")
//return getDateComponent(dateFormat: "MM")
//return getDateComponent(dateFormat: "MMM")
//return getDateComponent(dateFormat: "MMMM")
}
// Day
var currentDay: String? {
return getDateComponent(dateFormat: "dd")
//return getDateComponent(dateFormat: "d")
}
func getDateComponent(dateFormat: String) -> String? {
let format = DateFormatter()
format.dateFormat = dateFormat
return format.string(from: self)
}
}
let today = Date()
print("Current Year - \(today.currentYear)") // result Current Year - Optional("2017")
print("Current Month - \(today.currentMonth)") // result Current Month - Optional("7")
print("Current Day - \(today.currentDay)") // result Current Day - Optional("10")
i auf diese Weise tun ....
NSDate * mydate = [NSDate date];
NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate];
NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);
Um die Menschen lesbaren String zu bekommen (Tag, Monat, Jahr), können Sie tun:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];