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?

War es hilfreich?

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 NSCalendarUnits 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 zwei NSDate Werte vergleichen

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];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top