Как мне получить день недели с Foundation?

Ответы:

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

выводит текущий день недели в виде строки в языковом стандарте в зависимости от текущих региональных настроек.

Чтобы получить только номер дня недели, вы должны использовать класс NSCalendar:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];
Владимир
источник
14
И чтобы получить названия всех дней недели, вы можете использовать [dateFormatter weekdaySymbols](и подобное), который возвращает NSArray из NSStrings, начиная с воскресенья с индексом 0.
beetstra
Хорошо, как мне получить день недели, начинающийся с понедельника, а не с воскресенья?
Владимир Стажилов
2
@VovaStajilov, наверное, этот вопрос: stackoverflow.com/questions/1106943/… поможет. По сути, вам нужно установить в календаре первый weekDay как понедельник ([calendar setFirstWeekday: 2])
Владимир
1
первый NSLog возвращает 475221968, что является нереальным, огромным числом для дня недели. . .
coolcool1994 02
Ок, @Vladimir, ставил [gregorian setFirstWeekday:2];и за понедельник 06.01.2015 получаю 2 ( [components weekday]). Зачем? - Я нахожу ответ здесь
new2ios
18

Просто используйте эти три строчки:

CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
CFTimeZoneRef tz = CFTimeZoneCopySystem();
SInt32 WeekdayNumber = CFAbsoluteTimeGetDayOfWeek(at, tz);
Джон Вилунд
источник
3
Мне это нравится, но для некоторых новых разработчиков это будет считаться запутыванием (что может быть
плохим
3
CFAbsoluteTimeGetDayOfWeek устарел в iOS 8. Есть ли альтернативный способ использования CFCalendar?
Джордан Смит
15

Многие ответы здесь устарели. Это работает с iOS 8.4 и дает вам день недели в виде строки и числа.

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
В качестве побочного примечания - поскольку weekdayкомпонент NSCalendar- это NSInteger, вам нужно будет выполнить приведение [comps weekday]к int, если вам нужно, иначе он покажет предупреждение об этом.
mylogon
10

Вот как вы это делаете в Swift 3 и получаете локализованное название дня…

let dayNumber = Calendar.current.component(.weekday, from: Date()) // 1 - 7
let dayName = DateFormatter().weekdaySymbols[dayNumber - 1]
Эшли Миллс
источник
В Swift 3 следует использовать Calendar, а не 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

Мне нужен был простой (григорианский) индекс дня недели, где 0 = воскресенье и 6 = суббота, чтобы использовать его в алгоритмах сопоставления с образцом. Отсюда можно легко найти название дня в массиве с помощью индекса. Вот то, что я придумал, для чего не нужны средства форматирования даты, NSCalendar или манипуляции с компонентами даты:

+(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
источник
2

Вот обновленный код для Swift 3

Код:

let calendar = Calendar(identifier: .gregorian)

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

Чтобы напечатать имя события как строку:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

let name = datFormat.string(from: Date())
Janmenjaya
источник
2

Я думаю, что эта тема действительно полезна, поэтому я публикую код, совместимый со Swift 2.1 .

extension NSDate {

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

}

В любом месте вы можете позвонить:

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

Swift 3.0

Как предложил @ delta2flat, я обновляю ответ, давая пользователю возможность указать собственный формат.

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

}
Лука Даванцо
источник
это локализовано? что, если ваша предполагаемая страна хотела использовать «14 декабря, понедельник» или «14 декабря, понедельник декабря»? это должно быть обработано там
delta2flat
Привет @ delta2flat. Да, формат локализован. Кстати, я обновил ответ: теперь пользователь может указать собственный формат
Лука Даванцо,
Отлично - я обнаружил, что Objective-C / Cocoa Touch довольно эффективен с плавной локализацией строк в соответствии с локалью.
delta2flat
Ваше расширение Swift 3 должно иметь значение «Дата», а не NSDate.
Леон
1

Ответ Владимира сработал для меня, но я подумал, что опубликую ссылку Unicode для строк формата даты.

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

Эта ссылка предназначена для iOS 6. Другие версии iOS имеют другие стандарты, которые можно найти в документации X-Code.

EquiAvia Tech
источник
1

Вот так это работает в Swift:

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

Затем присвойте полученным числам дни недели.

мозг
источник
1
NSDate () возвращает текущую дату для GMT + 0, верно? Вы используете здесь NSDate, например, или компонент календаря автоматически определит текущую локаль и сдвиг времени?
Дима Деплов 08
0

У меня была довольно странная проблема с получением дня недели. Просто установить firstWeekday было недостаточно. Также необходимо было установить часовой пояс. Мое рабочее решение было:

 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: укажите день недели в одной строке. ( на основе ответа 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";

есть три символа, которые мы можем использовать для форматирования дня недели:

  • E
  • е
  • c

Следующие два документа могут вам помочь.

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

Демо:

Вы можете протестировать свой паттерн на этом сайте:

http://nsdateformatter.com/

Andy.C
источник