재단에서 요일을 어떻게 얻습니까?


답변:


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]인덱스 0에서 일요일로 시작하는 NSStrings의 NSArray를 반환하는 (및 유사)를 사용할 수 있습니다.
beetstra

좋아요, 일요일이 아닌 월요일부터 시작하는 요일을 어떻게 얻나요?
Vladimir Stazhilov

2
@VovaStajilov 아마도이 질문이 : stackoverflow.com/questions/1106943/… 도움이 될 것입니다. 기본적으로 달력의 첫 번째 weekDay를 월요일로 설정해야합니다 ([calendar setFirstWeekday : 2])
Vladimir

1
첫 번째 NSLog는 요일에 대해 비현실적이고 엄청난 수인 475221968을 반환합니다. . .
coolcool1994 2013-06-02

좋아, @Vladimir, 설정 [gregorian setFirstWeekday:2];하고 2015 년 1 월 6 일 월요일에 2 ( [components weekday])를 받습니다 . 왜? - 나는 답을 찾을 여기
new2ios

18

다음 세 줄을 사용하십시오.

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

3
나는 그것을 좋아하지만 거의 (악한 보너스를 할 수있다) 새로운 개발자 난독으로 간주 것)
데이비드 Rönnqvist에게

3
CFAbsoluteTimeGetDayOfWeek는 iOS 8에서 더 이상 사용되지 않습니다. CFCalendar를 사용하는 다른 방법이 있습니까?
Jordan Smith

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보다는 Calendar를 사용해야합니다.
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())

이벤트 이름을 문자열로 인쇄하려면 :

 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"

스위프트 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)
    }

}

현지화되어 있습니까? 원하는 국가에서 "12 월 14 일 월요일"또는 "12 월 14 일 월요일"을 사용하려는 경우 어떻게해야합니까? 그것은 그 안에 처리되어야
delta2flat

안녕하세요 @ delta2flat. 예, 형식이 현지화되었습니다. BTW 내가 업데이트 한 답 : 이제 사용자는 사용자 정의 형식을 지정할 수 있습니다
루카 Davanzo

훌륭합니다-Objective-C / Cocoa Touch가 로케일에 따라 문자열을 유동적으로 현지화하는 데 매우 강력하다는 것을 발견했습니다.
delta2flat

Swift 3 확장은 NSDate가 아닌 Date 여야합니다.
Leon


1

이렇게하면 Swift에서 작동합니다.

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

그런 다음 결과 숫자에 평일을 할당하십시오.


1
NSDate ()는 GMT + 0의 현재 날짜를 반환합니다. 맞습니까? 예를 들어 여기서 NSDate를 사용하거나 캘린더 구성 요소가 현재 로케일과 시간 이동을 자동으로 감지합니까?
Dima Deplov 2015

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

요일 형식을 지정하는 데 사용할 수있는 세 가지 기호가 있습니다.

  • 이자형
  • 이자형

다음 두 문서가 도움이 될 수 있습니다.

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/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.