Jak uzyskać dzień tygodnia z Foundation?


Odpowiedzi:


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

wyświetla bieżący dzień tygodnia jako ciąg w lokalizacji zależnej od aktualnych ustawień regionalnych.

Aby uzyskać tylko numer dnia tygodnia, musisz użyć klasy NSCalendar:

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

14
Aby uzyskać nazwy wszystkich dni tygodnia, możesz użyć [dateFormatter weekdaySymbols](i podobnych), co zwraca NSArray of NSStrings zaczynając od niedzieli o indeksie 0.
beetstra

OK, jak mogę ustawić dzień tygodnia zaczynający się od poniedziałku, a nie od niedzieli?
Vladimir Stazhilov

2
@VovaStajilov prawdopodobnie pomoże to pytanie: stackoverflow.com/questions/1106943/… . Zasadniczo musisz ustawić pierwszy tydzień w kalendarzu na poniedziałek ([calendar setFirstWeekday: 2])
Vladimir

1
pierwszy dziennik NSLog zwraca 475221968, co jest nierealistyczną, ogromną liczbą dla dnia tygodnia. . .
coolcool1994

Ok @Vladimir, ustawiłem [gregorian setFirstWeekday:2];i na poniedziałek 01.06.2015 otrzymuję 2 ( [components weekday]). Czemu? - Odpowiedź znajduję tutaj
new2ios

18

Po prostu użyj tych trzech linii:

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

3
Podoba mi się, ale to by się prawie liczyło jako zaciemnienie dla niektórych nowych deweloperów (co może być złym bonusem);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek jest przestarzała w iOS 8. Czy istnieje inny sposób używania CFCalendar?
Jordan Smith,

15

Wiele odpowiedzi tutaj jest przestarzałych. Działa od iOS 8.4 i podaje dzień tygodnia jako ciąg i jako liczbę.

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
Na marginesie - ponieważ weekdaykomponent NSCalendarjest an NSInteger, będziesz musiał rzucić [comps weekday]na an int, jeśli zajdzie taka potrzeba, w przeciwnym razie wyświetli ostrzeżenie dotyczące tego.
mylogon

10

Oto jak to zrobić w Swift 3 i uzyskać zlokalizowaną nazwę dnia…

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

W Swift 3 powinien być używany kalendarz zamiast NSCalendar.
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

Potrzebowałem prostego (gregoriańskiego) indeksu dnia tygodnia, w którym 0 = niedziela i 6 = sobota do wykorzystania w algorytmach dopasowywania wzorców. Stamtąd wystarczy wyszukać nazwę dnia z tablicy przy użyciu indeksu. Oto, co wymyśliłem, co nie wymaga formatowania daty, NSCalendar ani manipulacji składnikami daty:

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

Oto zaktualizowany kod dla Swift 3

Kod :

let calendar = Calendar(identifier: .gregorian)

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

Aby wydrukować nazwę zdarzenia jako ciąg:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

Myślę, że ten temat jest naprawdę przydatny, więc zamieszczam kod zgodny ze Swift 2.1 .

extension NSDate {

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

}

Gdziekolwiek możesz zadzwonić:

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

Swift 3.0

Jak zasugerował @ delta2flat, aktualizuję odpowiedź, dając użytkownikowi możliwość określenia niestandardowego formatu.

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

}

czy to jest zlokalizowane? co by się stało, gdyby w Twoim kraju wybrano „14 grudnia, poniedziałek” lub „14 poniedziałek grudnia”? należy to tam
załatwić

Cześć @ delta2flat. Tak, format jest zlokalizowany. Btw zaktualizowałem odpowiedź: teraz użytkownik może określić niestandardowy format
Luca Davanzo

Świetnie - odkryłem, że Objective-C / Cocoa Touch jest dość potężny w płynnym lokalizowaniu strun zgodnie z lokalizacją.
delta2flat

Twoje rozszerzenie do Swift 3 powinno być aktualne, a nie NSDate.
Leon


1

Tak to działa w Swift:

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

Następnie przypisz dni tygodnia do wynikowych liczb.


1
NSDate () zwraca bieżącą datę dla GMT + 0, prawda? Używasz NSDate na przykład tutaj, czy komponent kalendarza automatycznie wykryje bieżące ustawienia regionalne i przesunięcie czasu?
Dima Deplov

0

Miałem dość dziwny problem z ustaleniem dnia tygodnia. Samo ustawienie jako pierwsze Weekday nie wystarczyło. Konieczne było również ustawienie strefy czasowej. Moje rozwiązanie robocze to:

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

istnieją trzy symbole, których możemy użyć do sformatowania dnia tygodnia:

  • mi
  • mi
  • do

Poniższe dwa dokumenty mogą ci pomóc.

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

Próbny:

możesz przetestować swój wzór na tej stronie:

http://nsdateformatter.com/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.