Wie bekomme ich den Wochentag mit Foundation?


Antworten:


216
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[dateFormatter setDateFormat:@"EEEE"];
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);

Gibt den aktuellen Wochentag als Zeichenfolge im Gebietsschema aus, abhängig von den aktuellen regionalen Einstellungen.

Um nur eine Wochentagsnummer zu erhalten, müssen Sie die NSCalendar-Klasse verwenden:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];

14
Und um die Namen aller Wochentage zu erhalten, können Sie [dateFormatter weekdaySymbols](und ähnliche) verwenden, die ein NSArray von NSStrings ab Sonntag bei Index 0 zurückgeben.
Beetstra

Okay, wie bekomme ich einen Wochentag, der mit Montag beginnt, nicht mit Sonntag?
Vladimir Stazhilov

2
@VovaStajilov wahrscheinlich diese Frage: stackoverflow.com/questions/1106943/… wird helfen. Grundsätzlich müssen Sie den ersten Wochentag des Kalenders auf Montag einstellen ([Kalender setFirstWeekday: 2])
Vladimir

1
Der erste NSLog gibt 475221968 zurück, was eine unrealistische, riesige Zahl für den Wochentag ist. . .
coolcool1994

Ok, @Vladimir, ich setze [gregorian setFirstWeekday:2];und für Montag 01/06/2015 erhalte ich 2 ( [components weekday]). Warum? - Ich finde hier
new2ios

18

Verwenden Sie einfach diese drei Zeilen:

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

3
Ich mag es, aber das würde für einige neue Entwickler fast als Verschleierung gelten (was ein böser Bonus sein könnte);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek ist in iOS 8 veraltet. Gibt es eine alternative Möglichkeit, CFCalendar zu verwenden?
Jordan Smith

15

Viele der Antworten hier sind veraltet. Dies funktioniert ab iOS 8.4 und gibt Ihnen den Wochentag als Zeichenfolge und als Zahl an.

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
Als Randnotiz - Da es sich bei der weekdayKomponente von NSCalendarum eine handelt NSInteger, müssen Sie bei Bedarf [comps weekday]eine intumwandeln, da sonst eine Warnung angezeigt wird.
Mylogon

10

So machen Sie es in Swift 3 und erhalten einen lokalisierten Tagesnamen…

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

In Swift 3 sollte Kalender anstelle von NSCalendar verwendet werden.
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

Ich brauchte einen einfachen (gregorianischen) Wochentagsindex, wobei 0 = Sonntag und 6 = Samstag, um in Mustervergleichsalgorithmen verwendet zu werden. Von dort aus ist es einfach, den Tagesnamen mithilfe des Index aus einem Array nachzuschlagen. Folgendes habe ich mir ausgedacht, für das keine Datumsformatierer oder die Manipulation von NSCalendar oder Datumskomponenten erforderlich sind:

+(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

Hier ist der aktualisierte Code für Swift 3

Code:

let calendar = Calendar(identifier: .gregorian)

let weekdayAsInteger = calendar.component(.weekday, from: Date())

So drucken Sie den Namen des Ereignisses als Zeichenfolge:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

let name = datFormat.string(from: Date())

2

Ich denke, dieses Thema ist wirklich nützlich, deshalb poste ich Code, der mit Swift 2.1 kompatibel ist.

extension NSDate {

    static func getBeautyToday() -> String {
       let now = NSDate()
       let dateFormatter = NSDateFormatter()
       dateFormatter.dateFormat = "EEEE',' dd MMMM"
       return dateFormatter.stringFromDate(now)
    }

}

Überall können Sie anrufen:

let today = NSDate.getBeautyToday()
print(today) ---> "Monday, 14 December"

Swift 3.0

Wie von @ delta2flat vorgeschlagen, aktualisiere ich die Antwort, damit der Benutzer ein benutzerdefiniertes Format angeben kann.

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

}

ist das lokalisiert? Was wäre, wenn Ihr beabsichtigtes Land "14. Dezember, Montag" oder "14. Montag, Dezember" verwenden wollte? es sollte darin gehandhabt werden
delta2flat

Hi @ delta2flat. Ja, das Format ist lokalisiert. Übrigens habe ich die Antwort aktualisiert: Jetzt kann der Benutzer ein benutzerdefiniertes Format angeben
Luca Davanzo

Großartig - Ich habe festgestellt, dass Objective-C / Cocoa Touch sehr leistungsfähig ist, wenn Zeichenfolgen flüssig nach Gebietsschema lokalisiert werden.
Delta2flat

Ihre Swift Three-Erweiterung sollte "Date not NSDate" sein.
Leon


1

So funktioniert es in Swift:

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

Ordnen Sie dann die Wochentage den resultierenden Zahlen zu.


1
NSDate () gibt das aktuelle Datum für GMT + 0 zurück, oder? Sie verwenden hier nur NSDate, oder erkennt die Kalenderkomponente automatisch das aktuelle Gebietsschema und die aktuelle Zeitverschiebung?
Dima Deplov

0

Ich hatte ein ziemlich seltsames Problem damit, einen Wochentag zu bekommen. Nur die Einstellung des ersten Wochentags war nicht genug. Es war auch notwendig, die Zeitzone festzulegen. Meine Arbeitslösung war:

 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

Swift 2: Holen Sie sich den Wochentag in einer Zeile. ( basierend auf neoscribe Antwort )

let dayOfWeek  = Int((myDate.timeIntervalSinceReferenceDate / (60.0*60.0*24.0)) % 7)
let isMonday   = (dayOfWeek == 0)
let isSunday   = (dayOfWeek == 6)

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

Es gibt drei Symbole, mit denen wir den Wochentag formatieren können:

  • E.
  • e
  • c

Die folgenden zwei Dokumente können Ihnen helfen.

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

Demo:

Sie können Ihr Muster auf dieser Website testen:

http://nsdateformatter.com/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.