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]インデックス0で日曜日から始まるNSStringsのNSArrayのを返します(と同様の)、
beetstra

日曜日ではなく月曜日から始まる曜日を取得するにはどうすればよいですか?
ウラジミールスタジロフ

2
@VovaStajilovおそらくこの質問:stackoverflow.com/questions/1106943/…が役立ちます。基本的に、カレンダーの最初のweekDayを月曜日に設定する必要があります([calendar setFirstWeekday:2])
Vladimir

1
最初のNSLogは475221968を返しますが、これは曜日としては非現実的で膨大な数です。。。
coolcool1994 2013年

[OK]を、@Vladimirは、私が設定[gregorian setFirstWeekday:2];してのために月曜日2015年1月6日(私は2を受けます[components weekday])。どうして?-私はここで
new2ios

18

次の3行を使用してください。

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

3
私はそれが好きですが、それは一部の新しい開発者にとっては難読化としてほとんどカウントされます(これは悪いボーナスかもしれません);)
DavidRönnqvist2013

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 2016

10

これがSwift 3での実行方法であり、ローカライズされた曜日名を取得します…

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

Swift 3では、NSCalendarではなくCalendarを使用する必要があります。
jvarela 2017

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"

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

}

これはローカライズされていますか?対象国が「12月14日、月曜日」または「12月14日」を使用したい場合はどうなりますか?その中で処理する必要があります
delta2flat 2017年

@ delta2flat様 はい、フォーマットはローカライズされています。ところで、答えを更新しました。ユーザーはカスタム形式を指定できるようになりました
Luca Davanzo 2017年

すばらしい-Objective-C / Cocoa Touchは、ロケールに応じて文字列をローカライズすることで、非常に強力であることがわかりました。
delta2flat 2017年

Swift 3の拡張は、NSDateではなくDateにする必要があります。
レオン


1

このように、Swiftで機能します。

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

次に、結果の数値に平日を割り当てます。


1
NSDate()はGMT + 0の現在の日付を返しますよね?たとえば、ここではNSDateを使用していますか、それともカレンダーコンポーネントが現在のロケールと時間シフトを自動的に検出しますか?
ディマデプロフ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";

曜日のフォーマットに使用できる3つの記号があります。

  • E
  • e
  • c

次の2つのドキュメントが役立ちます。

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

デモ:

このWebサイトでパターンをテストできます。

http://nsdateformatter.com/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.