Comment obtenir le jour de la semaine avec Foundation?

Réponses:

216
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[dateFormatter setDateFormat:@"EEEE"];
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);

renvoie le jour de la semaine actuel sous forme de chaîne dans les paramètres régionaux en fonction des paramètres régionaux actuels.

Pour obtenir juste un numéro de jour de la semaine, vous devez utiliser la classe NSCalendar:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];
Vladimir
la source
14
Et pour obtenir les noms de tous les jours de la semaine, vous pouvez utiliser [dateFormatter weekdaySymbols](et similaire), qui renvoie un NSArray de NSStrings commençant par dimanche à l'index 0.
beetstra
D'accord, comment puis-je obtenir le jour de la semaine commençant par lundi, pas par dimanche?
Vladimir Stazhilov
2
@VovaStajilov probablement cette question: stackoverflow.com/questions/1106943/… vous aidera. En gros, vous devez définir la première semaine du calendrier comme lundi ([calendar setFirstWeekday: 2])
Vladimir
1
le premier NSLog renvoie 475221968, ce qui est un nombre énorme et irréaliste pour le jour de la semaine. . .
coolcool1994
Ok, @Vladimir, je fixe [gregorian setFirstWeekday:2];et pour le lundi 01/06/2015 je reçois 2 ( [components weekday]). Pourquoi? - Je trouve la réponse ici
new2ios
18

Utilisez simplement ces trois lignes:

CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
CFTimeZoneRef tz = CFTimeZoneCopySystem();
SInt32 WeekdayNumber = CFAbsoluteTimeGetDayOfWeek(at, tz);
John Wilund
la source
3
Je l'aime bien mais cela compterait presque comme une obscurcissement pour certains nouveaux développeurs (ce qui peut être un bonus diabolique);)
David Rönnqvist
3
CFAbsoluteTimeGetDayOfWeek est obsolète dans iOS 8. Existe-t-il un autre moyen d'utiliser CFCalendar?
Jordan Smith
15

La plupart des réponses ici sont obsolètes. Cela fonctionne à partir d'iOS 8.4 et vous donne le jour de la semaine sous forme de chaîne et de nombre.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE"];
NSLog(@"The day of the week: %@", [dateFormatter stringFromDate:[NSDate date]]);

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *comps = [gregorian components:NSCalendarUnitWeekday fromDate:[NSDate date]];
int weekday = [comps weekday];
NSLog(@"The week day number: %d", weekday);
George Steiner
la source
1
En remarque: le weekdaycomposant de NSCalendarétant un NSInteger, vous devrez effectuer un cast [comps weekday]en un int, si nécessaire, sinon il affichera un avertissement à ce sujet.
mylogon le
10

Voici comment procéder dans Swift 3 et obtenir un nom de jour localisé…

let dayNumber = Calendar.current.component(.weekday, from: Date()) // 1 - 7
let dayName = DateFormatter().weekdaySymbols[dayNumber - 1]
Ashley Mills
la source
Dans Swift 3, Calendar doit être utilisé plutôt que NSCalendar.
jvarela
7
-(void)getdate {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    [format setDateFormat:@"MMM dd, yyyy HH:mm"];
    NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
    [timeFormat setDateFormat:@"HH:mm:ss"];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init] ;
    [dateFormatter setDateFormat:@"EEEE"];

    NSDate *now = [[NSDate alloc] init];
    NSString *dateString = [format stringFromDate:now];
    NSString *theDate = [dateFormat stringFromDate:now];
    NSString *theTime = [timeFormat stringFromDate:now];

    NSString *week = [dateFormatter stringFromDate:now];
    NSLog(@"\n"
          "theDate: |%@| \n"
          "theTime: |%@| \n"
          "Now: |%@| \n"
          "Week: |%@| \n"
         , theDate, theTime,dateString,week); 
}
Ha cong Thuan
la source
3

J'avais besoin d'un index simple (grégorien) du jour de la semaine, où 0 = dimanche et 6 = samedi pour être utilisé dans les algorithmes de correspondance de modèle. À partir de là, il suffit de rechercher le nom du jour dans un tableau en utilisant l'index. Voici ce que j'ai trouvé qui ne nécessite pas de formateurs de date, ni de manipulation de NSCalendar ou de composant de date:

+(long)dayOfWeek:(NSDate *)anyDate {
    //calculate number of days since reference date jan 1, 01
    NSTimeInterval utcoffset = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSTimeInterval interval = ([anyDate timeIntervalSinceReferenceDate]+utcoffset)/(60.0*60.0*24.0);
    //mod 7 the number of days to identify day index
    long dayix=((long)interval+8) % 7;
    return dayix;
}
neoscrire
la source
2

Voici le code mis à jour pour Swift 3

Code:

let calendar = Calendar(identifier: .gregorian)

let weekdayAsInteger = calendar.component(.weekday, from: Date())

Pour imprimer le nom de l'événement sous forme de chaîne:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

let name = datFormat.string(from: Date())
Janmenjaya
la source
2

Je pense que ce sujet est vraiment utile, donc je poste du code compatible Swift 2.1 .

extension NSDate {

    static func getBeautyToday() -> String {
       let now = NSDate()
       let dateFormatter = NSDateFormatter()
       dateFormatter.dateFormat = "EEEE',' dd MMMM"
       return dateFormatter.stringFromDate(now)
    }

}

Partout où vous pouvez appeler:

let today = NSDate.getBeautyToday()
print(today) ---> "Monday, 14 December"

Swift 3.0

Comme @ delta2flat l'a suggéré, je mets à jour la réponse en donnant à l'utilisateur la possibilité de spécifier un format personnalisé.

extension NSDate {

    static func getBeautyToday(format: String = "EEEE',' dd MMMM") -> String {
        let now = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: now)
    }

}
Luca Davanzo
la source
est-ce localisé? Et si votre pays envisagé voulait utiliser "14 décembre, lundi" ou "14 lundi décembre"? il devrait y être traité
delta2flat
Salut @ delta2flat. Oui, le format est localisé. Btw j'ai mis à jour la réponse: maintenant l'utilisateur peut spécifier un format personnalisé
Luca Davanzo
Génial - J'ai trouvé que Objective-C / Cocoa Touch est assez puissant avec la localisation fluide des chaînes en fonction de la locale.
delta2flat
Votre extension Swift trois doit être à ce jour et non NSDate.
Leon
1

De cette façon, cela fonctionne dans Swift:

    let calendar = NSCalendar.currentCalendar()
    let weekday = calendar.component(.CalendarUnitWeekday, fromDate: NSDate())

Attribuez ensuite les jours de la semaine aux nombres résultants.

cerveau
la source
1
NSDate () renvoie la date actuelle pour GMT + 0, non? Vous utilisez NSDate ici juste par exemple, ou le composant de calendrier détectera automatiquement les paramètres régionaux actuels et le décalage horaire?
Dima Deplov
0

J'ai eu un problème assez étrange pour obtenir un jour de la semaine. Seul le réglage en premierWeekday ne suffisait pas. Il était également nécessaire de définir le fuseau horaire. Ma solution de travail était:

 NSCalendar* cal = [NSCalendar currentCalendar];
 [cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
 [cal setFirstWeekday:1]; //Sunday
 NSDateComponents* comp = [cal components:( NSWeekOfMonthCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekCalendarUnit)  fromDate:date];
 return [comp weekday]  ;
Maciej
la source
0

Swift 2: obtenez le jour de la semaine sur une seule ligne. ( basé sur la réponse neoscribe )

let dayOfWeek  = Int((myDate.timeIntervalSinceReferenceDate / (60.0*60.0*24.0)) % 7)
let isMonday   = (dayOfWeek == 0)
let isSunday   = (dayOfWeek == 6)
Simon Pouliot
la source
0
self.dateTimeFormatter = [[NSDateFormatter alloc] init];
self.dateTimeFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; // your timezone
self.dateTimeFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"zh_CN"]; // your locale
self.dateTimeFormatter.dateFormat = @"ccc MM-dd mm:ss";

il y a trois symboles que nous pouvons utiliser pour formater le jour de la semaine:

  • E
  • e
  • c

Les deux documents suivants peuvent vous aider.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html

http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

Démo:

vous pouvez tester votre modèle sur ce site:

http://nsdateformatter.com/

Andy.C
la source