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

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

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

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]

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

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

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

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

}

¿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

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.


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


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/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.