Bagaimana cara mendapatkan hari dalam seminggu dengan Foundation?


Jawaban:


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

mengeluarkan hari ini dalam seminggu sebagai string dalam lokal bergantung pada pengaturan regional saat ini.

Untuk mendapatkan nomor hari kerja saja, Anda harus menggunakan kelas NSCalendar:

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

14
Dan untuk mendapatkan nama dari semua hari kerja Anda dapat menggunakan [dateFormatter weekdaySymbols](dan serupa), yang mengembalikan NSArray NSStrings dimulai dengan Minggu di indeks 0.
beetstra

Oke, bagaimana cara mendapatkan hari dalam seminggu dimulai dengan Senin, bukan dengan Minggu?
Vladimir Stazhilov

2
@VovaStajilov mungkin pertanyaan ini: stackoverflow.com/questions/1106943/… akan membantu. Pada dasarnya Anda perlu mengatur hari minggu pertama kalender menjadi hari Senin ([set kalenderMinggu Pertama: 2])
Vladimir

1
NSLog pertama mengembalikan 475221968 yang merupakan angka yang tidak realistis dan sangat besar untuk hari dalam seminggu. . .
coolcool1994

Ok, @Vladimir, saya set [gregorian setFirstWeekday:2];dan untuk Senin 01/06/2015 saya terima 2 ( [components weekday]). Mengapa? - Saya menemukan jawabannya di sini
new2ios

18

Cukup gunakan tiga baris ini:

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

3
Saya menyukainya tetapi itu hampir dianggap sebagai kebingungan bagi beberapa pengembang baru (yang mungkin merupakan bonus jahat);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek tidak digunakan lagi di iOS 8. Apakah ada cara alternatif menggunakan CFCalendar?
Jordan Smith

15

Banyak jawaban di sini tidak digunakan lagi. Ini berfungsi pada iOS 8.4 dan memberi Anda hari dalam seminggu sebagai string dan sebagai angka.

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
Sebagai catatan tambahan - Karena weekdaykomponen dari NSCalendaradalah NSInteger, Anda perlu mentransmisikan [comps weekday]ke int, jika perlu, atau akan muncul peringatan terkait hal ini.
mylogon

10

Inilah cara Anda melakukannya di Swift 3, dan mendapatkan nama hari yang dilokalkan…

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

Di Swift 3, Kalender harus digunakan daripada 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

Saya membutuhkan indeks hari dalam seminggu (Gregorian) sederhana, di mana 0 = Minggu dan 6 = Sabtu untuk digunakan dalam algoritme pencocokan pola. Dari sana, mudah saja mencari nama hari dari array menggunakan indeks. Inilah yang saya dapatkan yang tidak memerlukan pemformat tanggal, atau NSCalendar atau manipulasi komponen tanggal:

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

Berikut adalah kode yang diperbarui untuk Swift 3

Kode:

let calendar = Calendar(identifier: .gregorian)

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

Untuk mencetak nama acara sebagai String:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

Saya pikir topik ini sangat berguna, jadi saya memposting beberapa kode yang kompatibel dengan Swift 2.1 .

extension NSDate {

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

}

Ke mana pun Anda dapat menelepon:

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

Swift 3.0.0

Seperti yang disarankan @ delta2flat, saya memperbarui jawaban yang memberi pengguna kemampuan untuk menentukan format khusus.

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

}

apakah ini dilokalkan? bagaimana jika negara tujuan Anda ingin menggunakan "14 Desember, Senin" atau "14 Senin Desember"? itu harus ditangani di dalamnya
delta2flat

Hai @ delta2flat. Ya, format dilokalkan. Btw Saya telah memperbarui jawaban: sekarang pengguna dapat menentukan format khusus
Luca Davanzo

Hebat - Saya telah menemukan bahwa Objective-C / Cocoa Touch cukup kuat dengan melokalkan string berdasarkan lokasi secara lancar.
delta2flat

Tiga ekstensi Swift Anda harus Berkencan bukan NSDate.
Leon


1

Cara ini bekerja di Swift:

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

Kemudian tetapkan hari kerja ke angka yang dihasilkan.


1
NSDate () mengembalikan tanggal sekarang untuk GMT + 0 kan? Anda menggunakan NSDate di sini hanya sebagai contoh, atau komponen kalender akan secara otomatis mendeteksi lokal saat ini dan pergeseran waktu?
Dima Deplov

0

Saya memiliki masalah yang cukup aneh dengan mendapatkan hari dalam seminggu. Hanya mengatur hari Minggu pertama saja tidak cukup. Zona waktu juga perlu diatur. Solusi kerja saya adalah:

 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: Dapatkan hari dalam satu baris. ( berdasarkan jawaban neoscribe )

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

ada tiga simbol yang bisa kita gunakan untuk memformat hari dalam seminggu:

  • E
  • e
  • c

Dua dokumen berikut dapat membantu Anda.

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:

Anda dapat menguji pola Anda di situs web ini:

http://nsdateformatter.com/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.