2015-10-28 4 views
7

Ich versuche, Montag Datum der aktuellen Woche zu bekommen. Dies wird in meiner Tabellenansicht als der erste Tag der Woche behandelt. Ich muss auch Sonntag der aktuellen Woche bekommen. Dies wird in meiner Tabellenansicht als letzter Tag der Woche behandelt.Wie bekomme ich das Montag-Datum der aktuellen Woche in swift

Aktuelle Versuch:

let date = NSDate() 
let calendar = NSCalendar.currentCalendar() 
calendar.firstWeekday = 1 
//attempt to changefirstday 

let dateFormatter = NSDateFormatter() 
let theDateFormat = NSDateFormatterStyle.ShortStyle 
let theTimeFormat = NSDateFormatterStyle.ShortStyle 
dateFormatter.dateStyle = theDateFormat 
dateFormatter.timeStyle = theTimeFormat 

let currentDateComponents = calendar.components([.YearForWeekOfYear, .WeekOfYear ], fromDate: date) 
let startOfWeek = calendar.dateFromComponents(currentDateComponents) 
print("startOfWeek is \(startOfWeek)") 
let stringDate = dateFormatter.stringFromDate(startOfWeek!) 
print("string date is \(stringDate)") //This is returning Sunday's date 
+0

Sie Kalender ISO8601, wo die ersten verwenden wochentag ist montag und nicht ändern firstWeekday zu 1 (Sonntag) lassen kalender = NSCalendar (calendarIdentifier: NSCalendarIdentifierISO8601)! –

+0

Ihre Frage ist mir unklar. Wenn Sie 'calendar.firstWeekday = 1 'festlegen, wird Sonntag als erster Tag der Woche definiert, sodass Ihr Ergebnis erwartet wird. –

Antwort

21

I Datum Erweiterungen schrieb Datum für bestimmten Wochentag zu bekommen und hier ist, wie einfach es mit Swift zu verwenden ist 4 ,

Date.today().next(.monday)     // Feb 12, 2018 at 12:00 AM 
Date.today().next(.sunday)     // Feb 11, 2018 at 12:00 AM 


Date.today().previous(.sunday)    // Feb 4, 2018 at 12:00 AM 
Date.today().previous(.monday)    // Feb 5, 2018 at 12:00 AM 

Date.today().previous(.thursday)    // Feb 1, 2018 at 12:00 AM 
Date.today().next(.thursday)     // Feb 15, 2018 at 12:00 AM 
Date.today().previous(.thursday, 
         considerToday: true) // Feb 8, 2018 at 11:04 PM 


Date.today().next(.monday) 
      .next(.sunday) 
      .next(.thursday)     // Feb 22, 2018 at 12:00 AM 

Und hier ist seit Erweiterung für das,

extension Date { 

    static func today() -> Date { 
     return Date() 
    } 

    func next(_ weekday: Weekday, considerToday: Bool = false) -> Date { 
    return get(.Next, 
       weekday, 
       considerToday: considerToday) 
    } 

    func previous(_ weekday: Weekday, considerToday: Bool = false) -> Date { 
    return get(.Previous, 
       weekday, 
       considerToday: considerToday) 
    } 

    func get(_ direction: SearchDirection, 
      _ weekDay: Weekday, 
      considerToday consider: Bool = false) -> Date { 

    let dayName = weekDay.rawValue 

    let weekdaysName = getWeekDaysInEnglish().map { $0.lowercased() } 

    assert(weekdaysName.contains(dayName), "weekday symbol should be in form \(weekdaysName)") 

    let searchWeekdayIndex = weekdaysName.index(of: dayName)! + 1 

    let calendar = Calendar(identifier: .gregorian) 

    if consider && calendar.component(.weekday, from: self) == searchWeekdayIndex { 
     return self 
    } 

    var nextDateComponent = DateComponents() 
    nextDateComponent.weekday = searchWeekdayIndex 


    let date = calendar.nextDate(after: self, 
           matching: nextDateComponent, 
           matchingPolicy: .nextTime, 
           direction: direction.calendarSearchDirection) 

    return date! 
    } 

} 

// MARK: Helper methods 
extension Date { 
    func getWeekDaysInEnglish() -> [String] { 
    var calendar = Calendar(identifier: .gregorian) 
    calendar.locale = Locale(identifier: "en_US_POSIX") 
    return calendar.weekdaySymbols 
    } 

    enum Weekday: String { 
    case monday, tuesday, wednesday, thursday, friday, saturday, sunday 
    } 

    enum SearchDirection { 
    case Next 
    case Previous 

    var calendarSearchDirection: Calendar.SearchDirection { 
     switch self { 
     case .Next: 
     return .forward 
     case .Previous: 
     return .backward 
     } 
    } 
    } 
} 
+0

und was ich ändern, um den Sonntag am Ende dieser Woche (1. November in dieser Woche) zu bekommen? – user2363025

+0

@ user2363025 Siehe meine Änderungen. – Sandeep

+0

kann ich jetzt nutzen (.Previous, "Monday") um den Montag der aktuellen Woche zu bekommen und (.Nächster, "Sunday", considerToday: true) den Sonntag der aktuellen Woche erfolgreich zu bekommen.Wenn die Woche an einem Montag beginnen und an einem Sonntag enden würde. Das ist was ich brauche, aber ich muss auch den folgenden Montag und folgenden Sonntag bekommen. Also kann ich Ihre bekommen (.Nächster, "Montag") um nächste Woche Montag zu bekommen, aber ich kann nicht den Sonntag der folgenden Woche bekommen. Kann das gemacht werden? – user2363025

2

Versuchen zu verwenden:

calendar.firstWeekday = 2 

bearbeiten

Um genauer zu sein: NSCalendar.currentCalendar() kehrt Benutzer Kalender. Entsprechend der Dokumentation:

Der zurückgegebene Kalender wird aus den Einstellungen für das ausgewählte Systemgebietsschema des aktuellen Benutzers gebildet und mit benutzerdefinierten Einstellungen überlagert, die der Benutzer in den Systemeinstellungen festgelegt hat.

Wenn Sie als erster Tag immer Montag wollen, ich glaube, Sie verwenden sollen:

let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
calendar!.firstWeekday = 2 
18

Sie Kalender ISO8601 verwenden können, wo der erste Wochentag Montag ist

var mondaysDate: NSDate { 
    let iso8601 = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)! 
    return iso8601.dateFromComponents(iso8601.components([.YearForWeekOfYear, .WeekOfYear], fromDate: NSDate()))! 
} 

print(mondaysDate.descriptionWithLocale(NSLocale.currentLocale())) // "Monday, October 26, 2015 at 12:00:00 AM Brasilia Summer Time" 

Swift 3 oder höher

var mondaysDate: Date { 
    return Calendar(identifier: .iso8601).date(from: Calendar(identifier: .iso8601).dateComponents([.yearForWeekOfYear, .weekOfYear], from: Date()))! 
} 

print(mondaysDate.description(with: .current)) // "Monday, November 7, 2016 at 12:00:00 AM Brasilia Summer Time\n" 
+1

Vielen Dank dafür .. :) –

+1

Dies sollte als die richtige Antwort markiert werden. Danke dafür. – Baza207

+1

Vielen Dank:) – iRiziya

0

Zusatz Antwort auf @Saneep

Wenn Sie gerne genaues dateTime nach gegebenem/aktuellem Datum (sagen wir mal, du wolltest Mo umwandeln) nday ​​des Datums- und Uhrzeit ->23-05-2016 12:00:00 zu 23-05-2016 05:35:17) dann versuchen, diese:

func convertDate(date: NSDate, toGivendate: NSDate) -> NSDate { 
    let calendar = NSCalendar.currentCalendar() 
    let comp = calendar.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: toGivendate) 
    let hour = comp.hour 
    let minute = comp.minute 
    let second = comp.second 

    let dateComp = calendar.components([.Year, .Month, .Day], fromDate: date) 
    let year = dateComp.year 
    let month = dateComp.month 
    let day = dateComp.day 

    let components = NSDateComponents() 
    components.year = year 
    components.month = month 
    components.day = day 
    components.hour = hour 
    components.minute = minute 
    components.second = second 

    let newConvertedDate = calendar.dateFromComponents(components) 

    return newConvertedDate! 
} 
5

Hier ist die Erweiterung I erstellt, zuerst findet es Sonntag und dann fügt es einen Tag

extension Date { 
    var startOfWeek: Date? { 
     let gregorian = Calendar(identifier: .gregorian) 
     guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil } 
     return gregorian.date(byAdding: .day, value: 1, to: sunday) 
    } 
} 
+0

Schöne Erweiterung, aber sollte nicht die Wertschöpfung 2 sein als '.firstWeekday'? Wenn ich den Wert 1 verwende, liefert er das Datum des Sonntags ... 'zurück gregorian.date (byAdding: .day, value: 2, to: sunday)' – Alessign

+2

Ich bin nicht sicher, warum du Sonntag bekommen würdest. Ich habe gerade versucht und bekam einen Montag http://swift.sandbox.bluemix.net/#/repl/598b2f8308bc28326a66e302 –