Як отримати день тижня з Фондом?


Відповіді:


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 / ... допоможе. В основному вам потрібно встановити перший тиждень календаря, щоб бути понеділком ([календар встановленийFirstWeekday: 2])
Володимир

1
перший NSLog повертає 475221968, що нереально, величезна кількість для дня тижня. . .
coolcool1994

Гаразд, @ Владимир, я встановив [gregorian setFirstWeekday:2];і за понеділок 01.06.2015 отримую 2 ( [components weekday]). Чому? - Я знаходжу відповідь тут
new2ios

18

Просто використовуйте ці три рядки:

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

3
Мені це подобається, але це майже вважатиметься затуманенням деяких нових розробників (що може бути злом бонусом);)
David Rönnqvist

3
У iOS 8. застарілий CFAbsoluteTimeGetDayOfWeek є чи альтернативним способом використання 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 слід використовувати Календар, а не 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;
}

2

Ось оновлений код для Swift 3

Код:

let calendar = Calendar(identifier: .gregorian)

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

Щоб надрукувати назву події як String:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

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 три повинно бути Дата, а не NSDate.
Леон


1

Це працює у Swift:

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

Потім призначте будні дні за отриманими числами.


1
NSDate () повертає поточну дату для GMT + 0 так? Ви тут використовуєте NSDate лише для прикладу, або компонент календаря автоматично виявить поточну локаль та зсув часу?
Діма Деплов

0

У мене було досить дивне питання з отриманням дня на тиждень. Тільки встановлення першогоWeekday було недостатньо. Також потрібно було встановити часовий пояс. Моє робоче рішення:

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

Є три символи, які ми можемо використовувати для форматування дня тижня:

  • Е
  • е
  • 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.