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?
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
.
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];
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
}
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 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)
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)
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.
à 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.
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 .
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 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)
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
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
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);
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];
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")