¿Cómo obtengo el día de la semana con Foundation?

Respuestas:

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

muestra el día de la semana actual como una cadena en la configuración regional que depende de la configuración regional actual.

Para obtener solo un número de día de la semana, debe usar la clase NSCalendar:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];
Vladimir
fuente
14
Y para obtener los nombres de todos los días de la semana, puede usar [dateFormatter weekdaySymbols](y similares), que devuelve un NSArray de NSStrings que comienza con el domingo en el índice 0.
beetstra
Bien, ¿cómo hago para que el día de la semana comience con el lunes, no con el domingo?
Vladimir Stazhilov
2
@VovaStajilov probablemente esta pregunta: stackoverflow.com/questions/1106943/… ayudará. Básicamente, debe configurar el primer día de la semana del calendario para que sea lunes ([calendar setFirstWeekday: 2])
Vladimir
1
el primer NSLog devuelve 475221968, que es un número enorme e irreal para el día de la semana. . .
coolcool1994
Ok, @Vladimir, configuro [gregorian setFirstWeekday:2];y para el lunes 01/06/2015 recibo 2 ( [components weekday]). ¿Por qué? - Encuentro la respuesta aquí
new2ios
18

Solo usa estas tres líneas:

CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
CFTimeZoneRef tz = CFTimeZoneCopySystem();
SInt32 WeekdayNumber = CFAbsoluteTimeGetDayOfWeek(at, tz);
John Wilund
fuente
3
Me gusta, pero eso casi contaría como una ofuscación para algunos desarrolladores nuevos (lo que puede ser una ventaja maligna);)
David Rönnqvist
3
CFAbsoluteTimeGetDayOfWeek está obsoleto en iOS 8. ¿Existe una forma alternativa de usar CFCalendar?
Jordan Smith
15

Muchas de las respuestas aquí están obsoletas. Esto funciona a partir de iOS 8.4 y le da el día de la semana como una cadena y como un número.

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
fuente
1
Como nota al margen: debido a que el weekdaycomponente de NSCalendares un NSInteger, deberá enviar [comps weekday]a un int, si es necesario, o de lo contrario mostrará una advertencia al respecto.
mylogon
10

Así es como lo haces en Swift 3 y obtienes un nombre de día localizado ...

let dayNumber = Calendar.current.component(.weekday, from: Date()) // 1 - 7
let dayName = DateFormatter().weekdaySymbols[dayNumber - 1]
Ashley Mills
fuente
En Swift 3, se debe usar Calendar en lugar de 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
fuente
3

Necesitaba un índice de día de la semana simple (gregoriano), donde 0 = domingo y 6 = sábado para usarlo en algoritmos de coincidencia de patrones. A partir de ahí, es una simple cuestión de buscar el nombre del día en una matriz utilizando el índice. Esto es lo que se me ocurrió que no requiere formateadores de fecha, NSCalendar o manipulación del componente de fecha:

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

Aquí está el código actualizado para Swift 3

Codigo:

let calendar = Calendar(identifier: .gregorian)

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

Para imprimir el nombre del evento como cadena:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

Creo que este tema es realmente útil, así que publico un código compatible 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)
    }

}

A cualquier lugar al que pueda llamar:

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

Swift 3.0

Como sugirió @ delta2flat, actualizo la respuesta dando al usuario la capacidad de especificar un formato personalizado.

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
fuente
¿Está esto localizado? ¿Qué pasa si su país de destino quisiera utilizar "14 de diciembre, lunes" o "14 de diciembre, lunes"? debe manejarse allí
delta2flat
Hola @ delta2flat. Sí, el formato está localizado. Por cierto, he actualizado la respuesta: ahora el usuario puede especificar un formato personalizado
Luca Davanzo
Genial: descubrí que Objective-C / Cocoa Touch es bastante poderoso para localizar cadenas de acuerdo con la ubicación de manera fluida.
delta2flat
Su extensión Swift tres debe ser hasta la fecha, no NSDate.
León
1

La respuesta de Vladimir funcionó bien para mí, pero pensé que publicaría el enlace Unicode para las cadenas de formato de fecha.

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

Este enlace es para iOS 6. Las otras versiones de iOS tienen diferentes estándares que se pueden encontrar en la documentación de X-Code.

Tecnología EquiAvia
fuente
1

De esta forma funciona en Swift:

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

Luego asigne los días de la semana a los números resultantes.

Brainray
fuente
1
NSDate () devuelve la fecha actual para GMT + 0, ¿verdad? ¿Utiliza NSDate aquí solo por ejemplo, o el componente de calendario detectará automáticamente la configuración regional actual y el cambio de hora?
Dima Deplov
0

Tuve un problema bastante extraño para conseguir un día de la semana. Establecer el primer día de la semana no fue suficiente. También era necesario establecer la zona horaria. Mi solución de trabajo fue:

 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
fuente
0

Swift 2: obtenga el día de la semana en una línea. ( basado en la respuesta de neoscribe )

let dayOfWeek  = Int((myDate.timeIntervalSinceReferenceDate / (60.0*60.0*24.0)) % 7)
let isMonday   = (dayOfWeek == 0)
let isSunday   = (dayOfWeek == 6)
Simon Pouliot
fuente
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";

hay tres símbolos que podemos usar para formatear el día de la semana:

  • mi
  • mi
  • C

Los siguientes dos documentos pueden ayudarlo.

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

Manifestación:

puedes probar tu patrón en este sitio web:

http://nsdateformatter.com/

Andy.C
fuente