Como faço para obter o dia da semana com a Foundation?


Respostas:


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

gera o dia da semana atual como uma string no local, dependendo das configurações regionais atuais.

Para obter apenas um número do dia da semana, você deve usar a classe NSCalendar:

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

14
E para obter os nomes de todos os dias da semana, você pode usar [dateFormatter weekdaySymbols](e semelhantes), que retorna um NSArray de NSStrings começando com domingo no índice 0.
beetstra

Ok, como faço para começar o dia da semana começando na segunda-feira, e não no domingo?
Vladimir Stazhilov

2
@VovaStajilov provavelmente esta pergunta: stackoverflow.com/questions/1106943/… vai ajudar. Basicamente, você precisa definir o primeiro dia da semana do calendário como segunda-feira ([definir calendário do primeiro dia da semana: 2])
Vladimir

1
o primeiro NSLog retorna 475221968, que é um número enorme e irreal para o dia da semana. . .
coolcool1994

Ok, @Vladimir, configurei [gregorian setFirstWeekday:2];e para segunda-feira 01/06/2015 recebo 2 ( [components weekday]). Por quê? - Encontro a resposta aqui
new2ios

18

Basta usar estas três linhas:

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

3
Eu gosto, mas isso quase contaria como ofuscamento para alguns novos desenvolvedores (o que pode ser um bônus maligno);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek foi descontinuado no iOS 8. Existe uma maneira alternativa de usar o CFCalendar?
Jordan Smith

15

Muitas das respostas aqui estão obsoletas. Isso funciona a partir do iOS 8.4 e fornece o dia da semana como uma string e como um 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 uma observação lateral - como o weekdaycomponente de NSCalendaré um NSInteger, você precisará lançar [comps weekday]para um int, se necessário, ou então ele mostrará um aviso sobre isso.
mylogon de

10

Veja como fazer no Swift 3 e obtenha um nome de dia localizado ...

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

No Swift 3, o Calendário deve ser usado em vez do 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

Eu precisava de um índice simples (gregoriano) de dias da semana, onde 0 = domingo e 6 = sábado para ser usado em algoritmos de correspondência de padrão. A partir daí, é uma simples questão de pesquisar o nome do dia em uma matriz usando o índice. Aqui está o que eu criei que não requer formatadores de data, ou NSCalendar ou manipulação de componente de 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

Aqui está o código atualizado para Swift 3

Código:

let calendar = Calendar(identifier: .gregorian)

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

Para imprimir o nome do evento como String:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

Acho que este tópico é muito útil, então posto algum código compatível com Swift 2.1 .

extension NSDate {

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

}

Para onde você puder ligar:

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

Swift 3.0

Como @ delta2flat sugeriu, atualizo a resposta, dando ao usuário a capacidade de especificar o 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)
    }

}

isso é localizado? e se o país pretendido quisesse usar "14 de dezembro, segunda-feira" ou "14 segunda-feira de dezembro"? deve ser tratado ali
delta2flat

Olá @ delta2flat. Sim, o formato está localizado. A propósito, atualizei a resposta: agora o usuário pode especificar o formato personalizado
Luca Davanzo

Ótimo - descobri que Objective-C / Cocoa Touch é muito poderoso com a localização de strings de acordo com a localidade.
delta2flat

Sua extensão Swift três deve ser Date, não NSDate.
Leon


1

Funciona assim em Swift:

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

Em seguida, atribua os dias da semana aos números resultantes.


1
NSDate () retorna a data atual para GMT + 0 certo? Você usa NSDate aqui apenas por exemplo, ou o componente de calendário detectará automaticamente o local atual e a mudança de horário?
Dima Deplov

0

Eu tive um problema bastante estranho em conseguir um dia da semana. Apenas definir o primeiro dia da semana não foi suficiente. Também era necessário definir o fuso horário. Minha solução de trabalho foi:

 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: obtenha o dia da semana em uma linha. (com base na resposta do 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";

existem três símbolos que podemos usar para formatar o dia da semana:

  • E
  • e
  • c

Os dois documentos a seguir podem ajudá-lo.

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:

você pode testar seu padrão neste site:

http://nsdateformatter.com/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.