Come ottengo il giorno della settimana con Foundation?


Risposte:


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

restituisce il giorno della settimana corrente come stringa nelle impostazioni internazionali in base alle impostazioni internazionali correnti.

Per ottenere solo un numero di giorno della settimana è necessario utilizzare la classe NSCalendar:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];

14
E per ottenere i nomi di tutti i giorni feriali puoi usare [dateFormatter weekdaySymbols](e simili), che restituisce un NSArray di NSStrings a partire da domenica all'indice 0.
beetstra

Va bene, come faccio a ottenere il giorno della settimana che inizia con lunedì e non con domenica?
Vladimir Stazhilov

2
@VovaStajilov probabilmente questa domanda: stackoverflow.com/questions/1106943/... aiuterà. Fondamentalmente devi impostare la prima settimana del calendarioDay to be Monday ([calendar setFirstWeekday: 2])
Vladimir

1
il primo NSLog restituisce 475221968 che è un numero enorme e non realistico per il giorno della settimana. . .
coolcool1994

Ok, @Vladimir, ho impostato [gregorian setFirstWeekday:2];e per lunedì 01/06/2015 ricevo 2 ( [components weekday]). Perché? - Trovo la risposta qui
new2ios

18

Usa queste tre righe:

CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
CFTimeZoneRef tz = CFTimeZoneCopySystem();
SInt32 WeekdayNumber = CFAbsoluteTimeGetDayOfWeek(at, tz);

3
Mi piace ma sarebbe quasi un offuscamento per alcuni nuovi sviluppatori (che potrebbe essere un bonus malvagio);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek è deprecato in iOS 8. Esiste un modo alternativo per utilizzare CFCalendar?
Jordan Smith,

15

Molte delle risposte qui sono deprecate. Funziona a partire da iOS 8.4 e ti dà il giorno della settimana come stringa e come numero.

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

1
Come nota a margine: poiché il weekdaycomponente di NSCalendarè un NSInteger, sarà necessario eseguire il cast [comps weekday]su un int, se necessario, altrimenti verrà visualizzato un avviso in merito.
miologon

10

Ecco come puoi farlo in Swift 3 e ottenere un nome del giorno localizzato ...

let dayNumber = Calendar.current.component(.weekday, from: Date()) // 1 - 7
let dayName = DateFormatter().weekdaySymbols[dayNumber - 1]

In Swift 3, è necessario utilizzare Calendar anziché 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); 
}

3

Avevo bisogno di un semplice indice (gregoriano) del giorno della settimana, dove 0 = domenica e 6 = sabato da utilizzare negli algoritmi di corrispondenza del pattern. Da lì è semplice cercare il nome del giorno da un array usando l'indice. Ecco cosa mi è venuto in mente che non richiede formattatori di data o NSCalendar o manipolazione dei componenti della data:

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

2

Ecco il codice aggiornato per Swift 3

Codice :

let calendar = Calendar(identifier: .gregorian)

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

Per stampare il nome dell'evento come stringa:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

let name = datFormat.string(from: Date())

2

Penso che questo argomento sia davvero utile, quindi inserisco del codice compatibile con Swift 2.1 .

extension NSDate {

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

}

Ovunque puoi chiamare:

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

Swift 3.0

Come suggerito da @ delta2flat, aggiorno la risposta dando all'utente la possibilità di specificare un formato personalizzato.

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

}

è localizzato? e se il paese di destinazione volesse utilizzare "14 dicembre, lunedì" o "14 lunedì dicembre"? dovrebbe essere gestito al suo interno
delta2flat

Ciao @ delta2flat. Sì, il formato è localizzato. Btw ho aggiornato la risposta: ora l'utente può specificare il formato personalizzato
Luca Davanzo

Fantastico: ho scoperto che Objective-C / Cocoa Touch è piuttosto potente con la localizzazione delle stringhe in base alle impostazioni locali.
delta2flat

La tua estensione Swift tre dovrebbe essere Data non NSDate.
Leon


1

In questo modo funziona in Swift:

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

Quindi assegnare i giorni della settimana ai numeri risultanti.


1
NSDate () restituisce la data corrente per GMT + 0, giusto? Usi NSDate qui solo per esempio, o il componente del calendario rileverà automaticamente le impostazioni internazionali e il fuso orario correnti?
Dima Deplov

0

Ho avuto un problema piuttosto strano nell'ottenere un giorno della settimana. Solo impostare firstWeekday non era sufficiente. Era inoltre necessario impostare il fuso orario. La mia soluzione di lavoro era:

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

0

Swift 2: ottieni il giorno della settimana in una riga. ( basato sulla risposta di neoscribe )

let dayOfWeek  = Int((myDate.timeIntervalSinceReferenceDate / (60.0*60.0*24.0)) % 7)
let isMonday   = (dayOfWeek == 0)
let isSunday   = (dayOfWeek == 6)

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

ci sono tre simboli che possiamo usare per formattare il giorno della settimana:

  • E
  • e
  • c

I seguenti due documenti possono aiutarti.

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

demo:

puoi testare il tuo modello su questo sito:

http://nsdateformatter.com/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.