Question

Comment puis-je obtenir l'année / mois / jour d'un objet NSDate, donné aucune autre information? Je me rends compte que je pourrais probablement le faire avec quelque chose de semblable à ceci:

NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];

Mais cela semble être beaucoup de tracas pour quelque chose d'aussi simple que de l'année / mois / jour d'NSDate. Y at-il une autre solution?

Était-ce utile?

La solution

Parce que c'est apparemment ma réponse la plus populaire, je vais essayer de le modifier pour contenir un peu plus d'informations.

Malgré son nom, NSDate en soi simplement marque un point dans le temps de la machine, pas une date. Il n'y a pas de corrélation entre le point dans le temps spécifié par un NSDate et un an, mois ou jour. Pour cela, vous devez vous référer à un calendrier. Tout point donné dans le temps retourne différentes informations à jour en fonction de ce calendrier que vous regardez (les dates ne sont pas les mêmes dans les calendriers grégorien et juifs, par exemple), et alors que le calendrier grégorien est le calendrier le plus largement utilisé dans le monde - Je suppose - nous sommes un peu biaisé que NSDate doit toujours utiliser ce. NSDate, heureusement, est beaucoup plus bipartisan.


Obtenir date et l'heure va devoir passer par NSCalendar, comme vous l'avez mentionné, mais il y a un moyen plus simple de le faire:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];

qui génère un objet NSDateComponents contenant le jour, le mois et l'année du calendrier actuel du système pour la journée en cours. ( Remarque:. ce n'est pas nécessairement le courant spécifiés par l'utilisateur calendrier, juste un système par défaut)

Bien sûr, si vous utilisez un autre calendrier ou la date, vous pouvez facilement changer. Une liste des calendriers disponibles et les unités de calendrier se trouve dans la section NSCalendar classe Référence. Plus d'informations sur NSDateComponents se trouve dans la section NSDateComponents classe référence.


Pour référence, l'accès aux composants individuels du NSDateComponents est assez facile:

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

Il suffit de garder à l'esprit: NSDateComponents ne contiendra aucune information valable pour tous les champs que vous demandez à moins que vous avec cette information générée en cours de validité (à savoir NSCalendar de demande de fournir cette information avec NSCalendarUnits). NSDateComponents ne contiennent aucune information de référence et d'eux-mêmes - ils ne sont que des structures simples qui détiennent des numéros d'accès pour vous. Si vous voulez obtenir aussi une époque, par exemple, de NSDateComponents, vous devrez alimenter la méthode du générateur de NSCalendar avec le drapeau de NSCalendarUnitEra.

Autres conseils

Vous pouvez obtenir le composant séparé d'un NSDate en utilisant NSDateFormatter:

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]];

Si vous souhaitez obtenir le numéro du mois au lieu d'abréviation, utilisez « MM ». Si vous souhaitez obtenir des entiers, utilisez [myDayString intValue];

Juste pour reformulez de l'excellent Itai code (et de travail!), Voici ce qu'est une classe d'aide échantillon ressemblerait, de revenir année valeur d'une variable NSDate donnée.

Comme vous pouvez le voir, il est assez facile de modifier ce code pour obtenir le mois ou le jour.

+(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;
}

(je ne peux pas croire que nous avoir à écrire nos propres fonctions de date iOS de base comme celui-ci, en 2013 ...)

Une autre chose:. Ne jamais utiliser pour comparer deux valeurs NSDate

XCode acceptons avec joie ce code (sans erreurs ou avertissements), mais ses résultats sont une loterie. Vous devez utiliser la fonction "Comparer" pour comparer NSDates:

if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}

Dans 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)

J'écris cette réponse car il est la seule approche qui n'OPTIONALS vous donne pas de retour de variables NSDateComponent et / ou de force déballant ces variables (également pour Swift 3).

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 version 3 amusant

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)

Nouveau Dans 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)

Si vous ciblez iOS 8+ vous pouvez utiliser les nouvelles méthodes pratiques de NSCalendar pour y parvenir dans un format plus laconique.

Tout d'abord créer un NSCalendar et utiliser tous les NSDate est nécessaire.

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];

Vous pourriez extraire les composants individuellement par component:fromDate:

NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];

Ou, encore plus succinctement, les pointeurs de l'utilisation NSInteger via getEra:year:month:day:fromDate:

NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];

Pour plus d'informations et des exemples consulter NSDate Manipulation Made Easy dans iOS 8 . Avertissement, je l'ai écrit le message.

d'iOS 8.0 (et OS X 10), vous pouvez utiliser la méthode composante pour simplifier l'obtention d'un composant de date comme ceci:

int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];

devrait rendre les choses plus simples et nous espérons que cela est mis en œuvre efficacement.

Si vous souhaitez obtenir les NSDateComponents individuels de NSDate, vous auriez certainement besoin la solution proposée par Itai Ferber. Mais si vous voulez aller de NSDate directement à un NSString, vous pouvez utiliser 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);

Voici la solution à 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) 

Essayez ceci. . .

Extrait de code:

 NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
 int year = [components year];
 int month = [components month];
 int day = [components day];

Il donne l'année, le mois, la date

Essayez ce qui suit:

    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)
    }
}

Vous pouvez l'utiliser comme

NSDate().currentDateInDayMonthYear()

Sortie

6 March 2016

Swift

Une manière plus facile d'obtenir des éléments de la date comme une chaîne en option.

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")

je fais de cette façon ....

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);

Pour obtenir la chaîne lisible par l'homme (jour, mois, année), vous pouvez le faire:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top