2010-08-19 15 views
10

Necesito poder obtener el día de la semana desde nsdate, tengo el siguiente código y siempre devuelve 1. Intenté cambiar el mes, intenté todo del 1 al 12, pero el resultado del día de la semana es siempre 1.Objetivo C - ¿Cómo puedo obtener el día de la semana de NSDate?

NSDate *date2 = [[NSDate alloc] initWithString:[NSString stringWithFormat:@"%d-%d-%d", 2010, 6, 1]]; 
unsigned units2 = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit; 
NSCalendar *calendar2 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components2 = [calendar2 components:units2 fromDate:date2]; 
int startWeekDay = [components2 weekday]; 
[date2 release]; 
[calendar2 release]; 
+0

Posible duplicado de [¿Cómo puedo obtener el día de la semana con Cocoa Touch?] (Http://stackoverflow.com/questions/4269093/how-do-i-get-the-day-of-the- week-with-cocoa-touch) – Suhaib

Respuesta

6

Editar para Mac:

el formato de la cadena tiene que ser -YYYY-MM-DD HH: MM: SS ± HHMM de acuerdo con los documentos, todos los campos obligatorios

Antiguo answe r (para iPhone y probado en el simulador):

No existe (público) -initWithString: método en el NSDate, y lo que te devuelve es no lo que esperas.

Utilice una configuración adecuada (debe dar el formato de entrada) NSDateFormatter y -dateFromString:.

+0

sí, hay> - initWithString: y mi problema era el formato de mi cadena – aryaxt

+0

Ah, lo siento, busqué en el iPhone NSDate que carece de esto. Edito mi respuesta ... – Eiko

43

Al crear un NSDateFormatter que solo contenga el día de la semana hará lo que quiera.

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

Si necesita internacionalización, la NSDateFormatter se puede enviar un local, lo que dará la traducción correcta.

La fecha formateadores son controlados a través de esta norma: Unicode Date Formats

+0

Creo que el OP quiere un número entero del día de la semana (por ejemplo, 1 = lunes, 2 = martes, 3 = miércoles, etc.). – dreamlax

+0

sí, eso es lo que estaba buscando – aryaxt

+2

Si quiere el número entero, solo tiene un conjunto: [weekday setDateFormat: @ "e"]; También debe establecer NSLocale ... por ejemplo: NSLocale * deLocale = [[[NSLocale alloc] initWithLocaleIdentifier: @ "de_DE"] liberación automática]; [día de la semana setLocale: deLocale]; De lo contrario, el jueves podría ser 5 en lugar de 4, si el día inicial de la semana es el domingo o el lunes. –

0

He resuelto el problema, el problema es que el formato de mi cadena de fecha estaba equivocada:

NSDate *date = [[NSDate alloc] initWithString:[NSString stringWithFormat:@"%d-%d-%d 10:45:32 +0600", selectedYear, selectedMonth, selectedDay]]; 

y puesto que no me importa sobre la vez que paso al azar una vez en el final de la cadena

0

estoy usando Xcode 6.4

Hay muchas maneras de configurar una NS Fecha. No voy a repasar eso aquí. Lo has hecho de una manera, usando una cadena (un método que evito porque es muy vulnerable al error), y lo estoy configurando de otra manera. Independientemente, acceda a sus componentes de lunes a viernes o establezca los métodos.

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar]; 
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"]]; 
NSDateComponents *components = [calendar components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitWeekday|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond) fromDate:[NSDate date]]; 
    NSDate *date = [calendar dateFromComponents:components]; 

esta manera, se puede obtener o establecer cualquiera de estos componentes como este:

[components weekday] //to get, then doSomething 
[components setDay:6]; //to set 

y, por supuesto, establece NSDate *date = [calendar dateFromComponents:components]; sólo después de que haya cambiado los componentes.

He añadido en el extra local y otros componentes para el contexto en caso de que desee establecer los también.

Es un código gratuito, no lo golpee.

Cuestiones relacionadas