NSDateを使用して曜日を取得する


89

「YYYY-MM-DD」形式の文字列を取り込んで、その週に関連する日付の位置を表すintを吐き出すことになっているメソッドを作成しました(月間で重複しているかどうかは関係ありません)。たとえば、sunday = 1 monday = 2などです。

これが私のコードです:

    func getDayOfWeek(today:String)->Int{

    var formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "YYYY-MM-DD"
    var todayDate:NSDate = formatter.dateFromString(today)!
    var myCalendar:NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
    var myComponents = myCalendar.components(NSCalendarUnit.WeekdayOrdinalCalendarUnit, fromDate: todayDate)
    var weekDay = myComponents.weekdayOrdinal
    return weekDay
}

私はそれNSCalendarUnit.WeekdayOrdinalCalendarが間違っていることを知っていますが、私はほとんどの論理的な組み合わせだと思います。そしてまた、myComponents.weekdayOrdinal例えば中古mycomponents.dayやをいじりました.weekday

使用するものの私のオプションは次のとおりです。

static var EraCalendarUnit: NSCalendarUnit { get }
static var YearCalendarUnit: NSCalendarUnit { get }
static var MonthCalendarUnit: NSCalendarUnit { get }
static var DayCalendarUnit: NSCalendarUnit { get }
static var HourCalendarUnit: NSCalendarUnit { get }
static var MinuteCalendarUnit: NSCalendarUnit { get }
static var SecondCalendarUnit: NSCalendarUnit { get }
static var WeekCalendarUnit: NSCalendarUnit { get }
static var WeekdayCalendarUnit: NSCalendarUnit { get }
static var WeekdayOrdinalCalendarUnit: NSCalendarUnit { get }
static var QuarterCalendarUnit: NSCalendarUnit { get }
static var WeekOfMonthCalendarUnit: NSCalendarUnit { get }
static var WeekOfYearCalendarUnit: NSCalendarUnit { get }
static var YearForWeekOfYearCalendarUnit: NSCalendarUnit { get }
static var CalendarCalendarUnit: NSCalendarUnit { get }
static var TimeZoneCalendarUnit: NSCalendarUnit { get }

DayOfWeekUnitオプション(または同様のもの)がないため、私にはわかりません。


1
文字のフォーマットについては、ICUフォーマットの日付と時刻を参照してください。
zaph 2014


1
@Suhaib私のタグを見ると、Objective-CではなくSwiftと書かれています。また、コードはスウィフト2である
boidkan

dateformatterで次の「EEEE」を試してください
Alexandros

回答:


118

あなたが探しているのは(私が質問を正しく理解していれば)ですNSCalendarUnit.CalendarUnitWeekday。の対応するプロパティはNSDateComponentsですweekday

日付形式が間違っていることにも注意してください(完全な仕様はここにあります:http//unicode.org/reports/tr35/tr35-6.html)。

自動型推論を使用すると、関数を少し簡略化できます。また、定数で十分な場合は変数を頻繁に使用します。さらに、関数はnil 無効な入力文字列用のオプションを返す必要があります。

Swift 3以降の更新されたコード

func getDayOfWeek(_ today:String) -> Int? {
    let formatter  = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    guard let todayDate = formatter.date(from: today) else { return nil }
    let myCalendar = Calendar(identifier: .gregorian)
    let weekDay = myCalendar.component(.weekday, from: todayDate)
    return weekDay
}

例:

if let weekday = getDayOfWeek("2014-08-27") {
    print(weekday)
} else {
    print("bad input")
}

スイフト2の元の答え

func getDayOfWeek(today:String)->Int? {

    let formatter  = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.dateFromString(today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)
        let weekDay = myComponents.weekday
        return weekDay
    } else {
        return nil
    }
}

はい、それはフォーマットが私を台無しにしていたものでした。WeekdayCalendarUnitを試したとき、4ではなく2を取得していて、非常に混乱していました。リンクをありがとう、私はそれを読みます。
boidkan 2014

1
元の質問の一部ではないことはわかっていますが、渡された日付が正しい形式でないか、何らかの方法で無効である場合に、オプションのIntを返すのに適した場所です。
マイクS

1
あるべきではありませんfunc getDayOfWeek(today:String)->Int?。オプションのアンラップを強制すると、それでもクラッシュしますね。
2014

1
@HAS:あなたは完全に正しいです、ありがとう!-オプションの割り当てif let ...は暗黙的にラップされていないオプションでも機能するため、テストケースではクラッシュしませんでした。
マーティンR

1
マーティングありがとうございます。回答をより美しくするために、編集してSwift 2コードを削除し、Swift3コードを保持することができます。次に、最後に「
Swift

154

スウィフト3&4

Swift 3では、DateComponentsオプションではなくなったため、曜日番号の取得が大幅に簡素化されました。これは拡張機能です。

extension Date {
    func dayNumberOfWeek() -> Int? {
        return Calendar.current.dateComponents([.weekday], from: self).weekday 
    }
}

// returns an integer from 1 - 7, with 1 being Sunday and 7 being Saturday
print(Date().dayNumberOfWeek()!) // 4

曜日の書面によるローカライズされたバージョンを探していた場合:

extension Date {
    func dayOfWeek() -> String? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "EEEE"
        return dateFormatter.string(from: self).capitalized 
        // or use capitalized(with: locale) if you want
    }
}

print(Date().dayOfWeek()!) // Wednesday

1
たぶん、Usageの下にaDate.dayOfWeek()を置くとより明確になるでしょう。
boidkan 2016年

1
問題は、「YYYY-MM-DD」の形式の文字列から平日を取得する方法であることに注意してください。もちろん、すでにNSDateをお持ちの場合は簡単になります。
マーティンR

4
あなたがそれを例えばで使用しているなら、それはおそらく言及する価値があります。テーブルビューでは、DateFormatterの作成にかなりのコストがかかるため、スクロールが遅くなる可能性があります。頻繁に使用する場合は、たとえば次のようにするとよいでしょう。1つのインスタンスを作成し、計算中にすべての関数呼び出しに提供します。
2017年

絶対に。その場合は、データの配列に対して関数を実行できる配列ハンドラーを用意することもできます。
brandonscript 2017年

1
より簡単なのは、以下の@ david72の回答です。Calendar.current.component(.weekday、from:Date())
Adam Smaka 2017

37

完全な「日曜日」、「月曜日」、「火曜日」、「水曜日」などが必要な場合。

編集:実際には、ローカライズされた日の名前を返す組み込みの形式があります:

extension NSDate {
    func dayOfTheWeek() -> String? {        
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "EEEE"
        return dateFormatter.stringFromDate(self)
    }
}

私の以前の解決策(英語のみ):

extension NSDate {

    func dayOfTheWeek() -> String? {
        let weekdays = [
            "Sunday",
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday",
            "Saturday"
        ]

        let calendar: NSCalendar = NSCalendar.currentCalendar()
        let components: NSDateComponents = calendar.components(.Weekday, fromDate: self)
        return weekdays[components.weekday - 1]
    }
}

カレンダーとコンポーネントをアンラップする必要はありません。それらはFoundationフレームワークによって保証されています。

使用法:

print(myDate.dayOfTheWeek())

5
EEEEEとEEEEEEは、短い形式の日を提供します。たとえば、水、木、

1
または、CalendarのshortWeekdaySymbolsプロパティを使用して、DateFormatterの作成を完全に回避します。
mikepj 2017年

22

簡単な答え(迅速な3):

Calendar.current.component(.weekday, from: Date())

11

私の場合、私は毎日3文字の文字列を探していました。@MartinRの関数を次のように変更しました。

func getDayOfWeekString(today:String)->String? {
    let formatter  = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.dateFromString(today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)
        let weekDay = myComponents.weekday
        switch weekDay {
        case 1:
            return "Sun"
        case 2:
            return "Mon"
        case 3:
            return "Tue"
        case 4:
            return "Wed"
        case 5:
            return "Thu"
        case 6:
            return "Fri"
        case 7:
            return "Sat"
        default:
            print("Error fetching days")
            return "Day"
        }
    } else {
        return nil
    }
}

2
EEEは次のように使用できますdateFormat
mrvincenzo 2017

10

もっと簡単な方法があります。文字列の日付を次の関数に渡すだけで、曜日の名前がわかります:)

func getDayNameBy(stringDate: String) -> String
    {
        let df  = NSDateFormatter()
        df.dateFormat = "YYYY-MM-dd"
        let date = df.dateFromString(stringDate)!
        df.dateFormat = "EEEE"
        return df.stringFromDate(date);
    }

2
「EEE」を探していました。ありがとう
anoo_radha

9
extension Date {

var weekdayName: String {
    let formatter = DateFormatter(); formatter.dateFormat = "E"
    return formatter.string(from: self as Date)
}

var weekdayNameFull: String {
    let formatter = DateFormatter(); formatter.dateFormat = "EEEE"
    return formatter.string(from: self as Date)
}
var monthName: String {
    let formatter = DateFormatter(); formatter.dateFormat = "MMM"
    return formatter.string(from: self as Date)
}
var OnlyYear: String {
    let formatter = DateFormatter(); formatter.dateFormat = "YYYY"
    return formatter.string(from: self as Date)
}
var period: String {
    let formatter = DateFormatter(); formatter.dateFormat = "a"
    return formatter.string(from: self as Date)
}
var timeOnly: String {
    let formatter = DateFormatter(); formatter.dateFormat = "hh : mm"
    return formatter.string(from: self as Date)
}
var timeWithPeriod: String {
    let formatter = DateFormatter(); formatter.dateFormat = "hh : mm a"
    return formatter.string(from: self as Date)
}

var DatewithMonth: String {
    let formatter = DateFormatter(); formatter.dateStyle = .medium ;        return formatter.string(from: self as Date)
}
}

使用法letweekday = Date()。weekdayName


8

Swift3日付拡張

extension Date {
    var weekdayOrdinal: Int {
        return Calendar.current.component(.weekday, from: self)
    }
}

私はあなたの答えに重要なポイントを追加しました。それはここでの最新の答えです。気に入らない場合は、もちろんお気軽にどうぞ!:)乾杯
Fattie 2017

質問は整数を求めました
quemeful 2017

6

このテーブルdate_formats を使用して、日付をさまざまな形式に変換できます。私の最短コード:

func getDayOfWeek(today: String) -> Int{
    let formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    let todayDate = formatter.dateFromString(today)
    formatter.dateFormat = "e" // "eeee" -> Friday
    let weekDay = formatter.stringFromDate(todayDate!)
    return Int(weekDay)!
}
getDayOfWeek("2015-12-18") // 6

どうもありがとうございましたこれは私が探していたものですformatter.dateFormat = "eeee" // "eeee"->金曜日
Mohammed Abunada 2018

4

SWIFT5-曜日

    extension Date {

        var dayofTheWeek: String {
             let dayNumber = Calendar.current.component(.weekday, from: self)
             // day number starts from 1 but array count from 0
             return daysOfTheWeek[dayNumber - 1]
        }

        private var daysOfTheWeek: [String] {
             return  ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
        }
     }

Fattieの回答に基づく日付の延長


3

実用的な解決策...

結果は1から7までの整数であることに注意してください。

(0から6ではありません。)

let trivialDayStringsORDINAL = ["", "SUN","MON","TUE","WED","THU","FRI","SAT"]
// note that zero is not used

その後 ...

let dow = Calendar.current.component(.weekday, from: someDate)
print( trivialDayStringsORDINAL[dow] )

3

ここにはすでに多くの答えがありますが、正しいCalendarAPIを使用してこれを行う別の、おそらくより良い方法があると思います。

次の拡張子weekdaySymbolsCalendardocs)のプロパティを使用して曜日を取得することをお勧めしDateます。

extension Date {

    /// Returns the day of the week as a `String`, e.g. "Monday"
    var dayOfWeek: String {
        let calendar = Calendar.autoupdatingCurrent
        return calendar.weekdaySymbols[calendar.component(.weekday, from: self) - 1]
    }
}

これには、Date最初に初期化する必要があります。これは、カスタムを使用して行いますDateFormatter

extension DateFormatter {

    /// returns a `DateFormatter` with the format "yyyy-MM-dd".
    static var standardDate: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }
}

次に、これを次のように呼び出すことができます。

DateFormatter.standardDate.date(from: "2018-09-18")!.dayOfWeek

私がこれを好む理由:

  1. dayOfWeek ユーザーのカレンダーが使用されるため、タイムゾーンを気にする必要はありません。ここにある他のソリューションのいくつかは、タイムゾーンが考慮されていないため、誤った日を表示します。
  2. 他の場所でも同じ形式の日付を使用する必要がある可能性が非常に高いので、再利用可能なものDateFormatterを作成して代わりに使用してみませんか?
  3. weekdaySymbols あなたのためにローカライズされています。
  4. weekDaySymbolsshortWeekdaySymbols「月」、「火」などの他のオプションに置き換えることができます。

注:この例DateFormatterでは、タイムゾーンやロケールも考慮されていないため、必要に応じて設定する必要があります。日付が常に正確である場合は、タイムゾーンの設定を検討してくださいTimeZone(secondsFromGMT: 0)


1
これは言及唯一の答えであることを驚くべきだweekdaySymbols、ありがとう
Fattie

1

日付(「5日」など)や月(8月など)など、日付からさらにいくつかの文字列が必要になりました。以下は、@ Martin Rの関数に基づいて作成し、3文字の文字列を返すように変更した3つの関数すべてです。

//Date String Helper Functions
func getDayOfWeek(today:String)->String? {
    let formatter  = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.dateFromString(today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)
        let weekDay = myComponents.weekday
        switch weekDay {
        case 1:
            return "Sun"
        case 2:
            return "Mon"
        case 3:
            return "Tue"
        case 4:
            return "Wed"
        case 5:
            return "Thu"
        case 6:
            return "Fri"
        case 7:
            return "Sat"
        default:
            print("Error fetching days")
            return "Day"
        }
    } else {
        return nil
    }
}

func getDateOfMonth(today:String)->String? {
    let formatter  = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.dateFromString(today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let myComponents = myCalendar.components(.Day, fromDate: todayDate)
        let weekDay = myComponents.day
        switch weekDay {
        case 1:
            return "1st"
        case 2:
            return "2nd"
        case 3:
            return "3rd"
        case 4:
            return "4th"
        case 5:
            return "5th"
        case 6:
            return "6th"
        case 7:
            return "7th"
        case 8:
            return "8th"
        case 9:
            return "9th"
        case 10:
            return "10th"
        case 11:
            return "11th"
        case 12:
            return "12th"
        case 13:
            return "13th"
        case 14:
            return "14th"
        case 15:
            return "15th"
        case 16:
            return "16th"
        case 17:
            return "17th"
        case 18:
            return "18th"
        case 19:
            return "19th"
        case 20:
            return "20th"
        case 21:
            return "21st"
        case 22:
            return "22nd"
        case 23:
            return "23rd"
        case 24:
            return "24th"
        case 25:
            return "25th"
        case 26:
            return "26th"
        case 27:
            return "27th"
        case 28:
            return "28th"
        case 29:
            return "29th"
        case 30:
            return "30th"
        case 31:
            return "31st"
        default:
            print("Error fetching Date Of Month")
            return "Day"
        }
    } else {
        return nil
    }
}

func getMonthOfYear(today:String)->String? {
    let formatter  = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.dateFromString(today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let myComponents = myCalendar.components(.Month, fromDate: todayDate)
        let month = myComponents.month
        switch month {
        case 1:
            return "Jan"
        case 2:
            return "Feb"
        case 3:
            return "Mar"
        case 4:
            return "Apr"
        case 5:
            return "May"
        case 6:
            return "Jun"
        case 7:
            return "Jul"
        case 8:
            return "Aug"
        case 9:
            return "Sep"
        case 10:
            return "Oct"
        case 11:
            return "Nov"
        case 12:
            return "Dec"
        default:
            print("Error fetching months")
            return "Month"
        }
    } else {
        return nil
    }
}

1

月曜日から始まる現在の週を表示するSWIFT2.0コード。

@IBAction func show(sender:AnyObject){

   // Getting Days of week corresponding to their dateFormat

    let calendar = NSCalendar.currentCalendar()
    let dayInt: Int!
    var weekDate: [String] = []
    var i = 2

    print("Dates corresponding to days are")
    while((dayInt - dayInt) + i < 9)
    {
        let weekFirstDate = calendar.dateByAddingUnit(.Day, value: (-dayInt+i), toDate: NSDate(), options: [])
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "EEEE dd MMMM"
        let dayOfWeekString = dateFormatter.stringFromDate(weekFirstDate!)
        weekDate.append(dayOfWeekString)
        i++
    }
    for i in weekDate
    {
        print(i) //Printing the day stored in array
    }
}

// function to get week day
func getDayOfWeek(today:String)->Int {

    let formatter  = NSDateFormatter()
    formatter.dateFormat = "MMM-dd-yyyy"
    let todayDate = formatter.dateFromString(today)!
    let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)
    let weekDay = myComponents.weekday
    return weekDay
}


@IBAction func DateTitle(sender: AnyObject) {


    // Getting currentDate and weekDay corresponding to it
    let currentDate = NSDate()
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MMM-dd-yyyy"
    let dayOfWeekStrings = dateFormatter.stringFromDate(currentDate)
    dayInt = getDayOfWeek(dayOfWeekStrings)

}

1

このコードは、今週全体を検索するためのものです。それはSwift2.0で書かれています:

var i = 2
var weekday: [String] = []
var weekdate: [String] = []
var weekmonth: [String] = []

@IBAction func buttonaction(sender: AnyObject) {

    let currentDate = NSDate()
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MMM-dd-yyyy"
    let dayOfWeekStrings = dateFormatter.stringFromDate(currentDate)
    let weekdays = getDayOfWeek(dayOfWeekStrings)
    let calendar = NSCalendar.currentCalendar()

    while((weekdays - weekdays) + i < 9)
    {
        let weekFirstDate = calendar.dateByAddingUnit(.Day, value: (-weekdays+i), toDate: NSDate(), options: [])

        let dayFormatter = NSDateFormatter()
        dayFormatter.dateFormat = "EEEE"
        let dayOfWeekString = dayFormatter.stringFromDate(weekFirstDate!)
        weekday.append(dayOfWeekString)

        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "dd"
        let dateOfWeekString = dateFormatter.stringFromDate(weekFirstDate!)
        weekdate.append(dateOfWeekString)

        let monthFormatter = NSDateFormatter()
        monthFormatter.dateFormat = "MMMM"
        let monthOfWeekString = monthFormatter.stringFromDate(weekFirstDate!)
        weekmonth.append(monthOfWeekString)

        i++
    }

    for(var j = 0; j<7 ; j++)
    {
    let day = weekday[j]
    let date = weekdate[j]
    let month = weekmonth[j]
    var wholeweek = date + "-" + month + "(" + day + ")"
    print(wholeweek)
    }

}

func getDayOfWeek(today:String)->Int {
    let formatter  = NSDateFormatter()
    formatter.dateFormat = "MMM-dd-yyyy"
    let todayDate = formatter.dateFromString(today)!
    let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)
    let daynumber = myComponents.weekday
    return daynumber
}

出力は次のようになります。

3月14日(月)3月15日(火)3月16日(水)3月17日(木)3月18日(金)3月19日(土)3月20日(日)


1

Swift 3:Xcode 8ヘルパー関数:

func getDayOfWeek(fromDate date: Date) -> String? {
    let cal = Calendar(identifier: .gregorian)
    let dayOfWeek = cal.component(.weekday, from: date)
    switch dayOfWeek {
     case 1:
        return "Sunday"
    case 2:
        return "Monday"
    case 3:
        return "Tuesday"
    case 4:
        return "Wednesday"
    case 5:
        return "Thursday"
    case 6:
        return "Friday"
    case 7:
        return "Saturday"
    default:
        return nil
    }
}

1
これはローカライズされていません。
アレクサンダー-モニカを復活させる

0

Swift4が文字列から平日を取得する場合

   func getDayOfWeek(today:String)->Int {
        let formatter  = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        let todayDate = formatter.date(from: today)!
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
        let myComponents = myCalendar.components(NSCalendar.Unit.weekday, from: todayDate)
        let weekDay = myComponents.weekday
        return weekDay!
    }

let weekday = getDayOfWeek(today: "2018-10-10")
print(weekday) // 4

これはstackoverflow.com/a/25533357/1187415の最初の方法とどう違うのですか?
マーティンR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.