NSDate get Année/Mois / Jour

Comment puis-je obtenir l'Année/Mois/Jour d'un objet NSDate sans autre information? Je me rends compte que je pourrais probablement faire cela 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 qui semble être un tas de tracas pour quelque chose d'aussi simple que d'obtenir un NSDate année/mois/jour. Est-il une autre solution?

280
demandé sur Richard J. Ross III 2010-09-12 16:45:28

17 réponses

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

malgré son nom, NSDate en soi marque simplement un point dans le temps machine, pas une date. Il n'y a pas de corrélation entre le moment spécifié par un NSDate et une année, un mois ou un jour. Pour cela, vous devez vous référer à un calendrier. N'importe quel point dans le temps retournera des informations de date différentes basées sur ce que le calendrier vous êtes en regardant (les dates ne sont pas les mêmes dans les calendriers grégorien et juif, 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 partial que NSDate devrait toujours l'utiliser. NSDate , heureusement, est beaucoup plus bipartisan.


obtenir la date et l'heure va passer par NSCalendar , comme vous l'avez mentionné, mais il ya une façon 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 système courant pour le jour courant. ( Note: ce n'est pas nécessairement le calendrier actuel spécifié par l'utilisateur , juste celui du système par défaut.)

bien sûr, si vous utilisez un calendrier ou une date différente, vous pouvez facilement changer cela. Une liste des calendriers et des unités de calendrier disponibles peut être trouvée dans le NSCalendar Référence De Classe . Plus d'informations sur NSDateComponents peuvent être trouvées dans le NSDateComponents référence de classe .


pour référence, l'accès aux différents composants du NSDateComponents est assez facile:

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

vous devez juste être conscient: NSDateComponents ne contiendra pas d'informations valides pour tous les champs que vous demandez à moins que vous les avez générés avec cela information valide (c.-à-d. demande NSCalendar pour fournir cette information avec NSCalendarUnit s). NSDateComponents ne contient aucune information de référence en soi - ce sont juste des structures simples qui contiennent des numéros auxquels vous pouvez accéder. Si vous voulez également obtenir une era, par exemple, de NSDateComponents , vous devrez alimenter la méthode du générateur de NSCalendar avec le drapeau NSCalendarUnitEra .

594
répondu Itai Ferber 2014-07-17 19:48:34

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 de l'abréviation, utilisez"MM". Si vous souhaitez obtenir des entiers, utilisez [myDayString intValue];

49
répondu skocko76 2014-04-07 08:22:03

juste pour reformuler Itai est excellent (et de travail!) code, Voici à quoi ressemble une classe helper sample, pour retourner la valeur année 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 ayons à écrire nos propres fonctions de base de date iOS comme ceci, en 2013...)

Une autre chose: ne jamais utilisez < et > pour comparer deux valeurs de NSDate.

XCode acceptera volontiers un tel code (sans aucune erreur ou avertissement), mais ses résultats sont une loterie. Vous doit utilisez la fonction "Comparer" pour comparer NSDates:

if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}
16
répondu Mike Gledhill 2013-05-16 09:43:20

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)
13
répondu NatashaTheRobot 2015-08-23 17:34:40

j'écris cette réponse parce que c'est la seule approche qui ne vous donne pas d'options de retour des variables NSDateComponent et/ou de force pour déballer 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 3 fun 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)
10
répondu Kevin 2017-08-05 14:02:13

nouveautés 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)
7
répondu Yuchen Zhong 2016-02-26 16:39:59

si vous ciblez iOS 8+, Vous pouvez utiliser les nouvelles méthodes de commodité NSCalendar pour réaliser ceci dans un format plus terne.

créer D'abord un NSCalendar et utiliser n'importe quel NSDate est requis.

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

vous pouvez extraire des composants individuellement via 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, utiliser NSInteger pointeurs 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, consultez Manipulation NSDate rendue facile dans iOS 8 . Avertissement, j'ai écrit le post.

4
répondu Joe Masilotti 2015-02-10 11:47:40

à partir de iOS 8.0 (et OS X 10), vous pouvez utiliser la component méthode pour simplifier l'obtention d'une date unique component comme so:

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

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

3
répondu Christopher King 2015-09-16 01:18:20

si vous souhaitez obtenir les composants Nsdatec de NSDate, vous aurez certainement besoin de la solution proposée par Itai Ferber. Mais si vous voulez que passe directement de NSDate à un NSString, vous pouvez utiliser NSDateFormatter .

2
répondu gumbo 2017-05-23 11:47:17
    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);
2
répondu Linh Nguyen 2014-04-08 03:29:07

Voici la solution dans 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) 
2
répondu Nitin Nain 2015-06-25 07:02:26

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];
1
répondu loretoparisi 2014-01-17 09:40:56

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
1
répondu Alserda 2016-03-06 22:41:03

essayez ceci . . .

"151940920 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 année courante, mois, date

1
répondu Yogeesh H T 2016-03-18 15:29:47

c'est ce que je fais ....

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);
0
répondu Shaik Riyaz 2014-05-20 11:46:40

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

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
0
répondu mirap 2017-05-06 10:59:18

Swift

façon plus facile d'obtenir n'importe quels éléments de date comme chaîne optionnelle.

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")
0
répondu Krunal 2017-07-10 12:21:38