รับวันในสัปดาห์โดยใช้ NSDate


91

ฉันสร้างเมธอดที่ควรใช้เป็นสตริงในรูปแบบ "ปปปป - ดด - วว" และพ่น int ที่แสดงถึงตำแหน่งวันที่ที่สัมพันธ์กับสัปดาห์ที่เป็นอยู่ (ไม่ว่าจะทับซ้อนกันระหว่างเดือน) เช่นวันอาทิตย์ = 1 วันจันทร์ = 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มันผิด แต่ฉันได้ลองแล้วฉันคิดว่าชุดค่าผสมที่สมเหตุสมผลที่สุด และยังมี messed รอบด้วย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


1
@Suhaib ถ้าคุณดูแท็กของฉันมันบอกว่า Swift ไม่ใช่ Objective-C นอกจากนี้โค้ดยังอยู่ใน Swift 2
boidkan

ลองใช้ "EEEE" ต่อไปนี้ในรูปแบบวันที่ของคุณ
Alexandros

คำตอบ:


121

สิ่งที่คุณกำลังมองหา (ถ้าผมเข้าใจคำถามถูกต้อง) 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")
}

คำตอบเดิมสำหรับSwift 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
    }
}

ใช่มันเป็นรูปแบบที่ทำให้ฉันสับสน ฉันได้รับ 2 แทนที่จะเป็น 4 เมื่อฉันลอง WeekdayCalendarUnit และรู้สึกสับสนมาก! ขอบคุณสำหรับลิงค์ฉันจะอ่านต่อ
boidkan

1
ฉันรู้ว่าไม่ใช่ส่วนหนึ่งของคำถามเดิม แต่นี่เป็นจุดที่ดีในการส่งคืน Int ที่เป็นทางเลือกในกรณีที่วันที่ที่ผ่านไม่อยู่ในรูปแบบที่ถูกต้องหรือไม่ถูกต้องในบางกรณี
Mike S

1
มันไม่ควรfunc getDayOfWeek(today:String)->Int?. หากคุณบังคับให้แกะอุปกรณ์เสริมออกก็ยังขัดข้องใช่หรือไม่?
HAS

1
@HAS: คุณพูดถูกต้องขอบคุณ! - ไม่เกิดข้อผิดพลาดในกรณีทดสอบของฉันเนื่องจากการกำหนดทางเลือกใช้if let ...งานได้กับตัวเลือกที่ไม่ได้ปิดโดยปริยาย
Martin R

1
ขอบคุณ Marting สำหรับสิ่งนี้เพื่อให้คำตอบของคุณสวยงามยิ่งขึ้นคุณสามารถแก้ไขได้เพื่อลบรหัส swift 2 และเก็บรหัส swift 3 ไว้ จากนั้นเพิ่มข้อความต่อท้ายว่า: "ถ้าคุณต้องการรหัสสำหรับ swift 2 ให้ตรวจสอบการแก้ไขก่อนหน้านี้" หรืออะไรทำนองนั้น
Suhaib

158

Swift 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
อาจจะชัดเจนกว่านี้ถ้าคุณใส่ aDate.dayOfWeek () ไว้ใต้การใช้งาน
boidkan

1
โปรดทราบว่าคำถามคือวิธีรับวันธรรมดาจากสตริงในรูปแบบ "YYYY-MM-DD" แน่นอนว่าจะง่ายขึ้นหากคุณมี NSDate อยู่แล้ว
Martin R

4
มันอาจจะคุ้มค่าที่จะพูดถึงว่าถ้าคุณใช้มันในเช่น มุมมองตารางอาจทำให้การเลื่อนช้าลงเนื่องจากการสร้าง DateFormatter มีค่าใช้จ่ายค่อนข้างสูง หากคุณจะใช้บ่อยครั้งก็ควรเช่น สร้างหนึ่งอินสแตนซ์และจัดเตรียมระหว่างการคำนวณสำหรับการเรียกใช้ฟังก์ชันทั้งหมด
Vive

อย่างแน่นอน ในกรณีนั้นแม้จะมีตัวจัดการอาร์เรย์ที่คุณสามารถเรียกใช้ฟังก์ชันบนอาร์เรย์ของข้อมูลก็จะมีประโยชน์
brandonscript

1
ง่ายกว่าจะเป็นเพียงคำตอบของ @ david72 ด้านล่าง: Calendar.current.component (.weekday, from: Date ())
Adam Smaka

38

หากคุณต้องการ "วันอาทิตย์" "วันจันทร์" "วันอังคาร" "วันพุธ" ฯลฯ เต็มรูปแบบ

แก้ไข: มีรูปแบบในตัวที่ส่งคืนชื่อวันที่แปลเป็นภาษาท้องถิ่น:

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

คุณไม่จำเป็นต้องแกะปฏิทินและส่วนประกอบต่าง ๆ แต่ได้รับการรับรองจากกรอบงานพื้นฐาน

การใช้งาน:

print(myDate.dayOfTheWeek())

6
EEEEE และ EEEEEE จะให้รูปแบบสั้น ๆ ของวันเช่นพุธ,
Matjan

1
หรือใช้คุณสมบัติ shortWeekdaySymbols ของปฏิทินเพื่อหลีกเลี่ยงการสร้าง DateFormatter ทั้งหมด
mikepj


11

ในกรณีของฉันฉันอยู่หลังสายอักขระสามตัวในแต่ละวัน ฉันแก้ไขฟังก์ชันของ @Martin R ดังนี้:

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

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

การใช้งานให้ weekday = Date (). weekdayName


8

ส่วนขยายวันที่ของ Swift 3

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

ฉันได้เพิ่มประเด็นสำคัญในคำตอบของคุณซึ่งเป็นคำตอบล่าสุดที่นี่ แน่นอนว่าอย่าลังเลที่จะผ่อนคลายถ้าคุณไม่ชอบ! :) Cheers
Fattie

คำถามถามว่าเป็นจำนวนเต็ม
ไร้สาระ

6

คุณสามารถใช้วันที่_ รูปแบบตารางนี้สำหรับการแปลงวันที่ของคุณเป็นรูปแบบต่างๆ รหัสที่สั้นที่สุดของฉัน:

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

4

SWIFT 5 - วันในสัปดาห์

    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

แนวทางแก้ไข ...

โปรดทราบว่าผลลัพธ์เป็นจำนวนเต็มหนึ่งถึงเจ็ด

(ไม่ใช่ศูนย์ถึงหก)

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

มีคำตอบมากมายที่นี่ แต่ฉันคิดว่ามีวิธีอื่นที่อาจจะดีกว่าในการทำเช่นนี้โดยใช้ที่ถูกต้อง Calendar API ที่

ฉันขอแนะนำให้รับวันในสัปดาห์โดยใช้weekdaySymbolsคุณสมบัติของCalendar( docs ) ในส่วนขยายเพื่อ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. weekDaySymbolsสามารถแทนที่ด้วยตัวเลือกอื่น ๆ เช่นshortWeekdaySymbolsสำหรับ "จันทร์" "วันอังคาร" เป็นต้น

โปรดทราบ:ตัวอย่างDateFormatterนี้ยังไม่พิจารณาเขตเวลาหรือสถานที่คุณจะต้องตั้งค่าตามที่คุณต้องการ TimeZone(secondsFromGMT: 0)ถ้าวันอยู่เสมอได้อย่างแม่นยำพิจารณาตั้งโซนเวลา


1
น่าประหลาดใจที่นี่เป็นคำตอบเดียวที่กล่าวถึงweekdaySymbolsขอบคุณ
Fattie

1

ฉันต้องการสตริงเพิ่มอีกสองสามรายการจากวันที่ซึ่งรวมถึงวันที่ของสัปดาห์ (เช่น "วันที่ 5") และเดือนของปี (เช่น ส.ค. ) ด้านล่างนี้คือฟังก์ชั่นทั้งสามที่ฉันสร้างขึ้นโดยอิงจากฟังก์ชันของ @Martin R และแก้ไขเพื่อส่งคืน 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

รหัส SWIFT 2.0 เพื่อนำเสนอสัปดาห์ปัจจุบันเริ่มตั้งแต่วันจันทร์

@IBAction func show (ผู้ส่ง: 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

รหัสนี้ใช้เพื่อค้นหาทั้งสัปดาห์ปัจจุบัน มันเขียนด้วย Swift 2.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
}

ผลลัพธ์จะเป็นดังนี้:

14 มีนาคม (จันทร์) 15 มีนาคม (อังคาร) 16 มีนาคม (พุธ) 17 มีนาคม (พฤหัสบดี) 18 มีนาคม (ศุกร์) 19 มีนาคม (เสาร์) 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
นี่ไม่ใช่ภาษาท้องถิ่น
Alexander

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อย่างไร
Martin R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.