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];
Vladimir
quelle
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);
John Wilund
quelle
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);
George Steiner
quelle
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]
Ashley Mills
quelle
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); 
}
Ha cong Thuan
quelle
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;
}
neoscribe
quelle
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())
Janmenjaya
quelle
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)
    }

}
Luca Davanzo
quelle
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

Die Antwort von Vladimir hat für mich gut funktioniert, aber ich dachte, ich würde den Unicode-Link für die Zeichenfolgen im Datumsformat veröffentlichen.

http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns

Dieser Link ist für iOS 6. Die anderen Versionen von iOS haben andere Standards, die in der X-Code-Dokumentation zu finden sind.

EquiAvia Tech
quelle
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.

Brainstray
quelle
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]  ;
Maciej
quelle
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)
Simon Pouliot
quelle
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/

Andy.C
quelle