Foundation ile haftanın gününü nasıl edinirim?


Yanıtlar:


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

geçerli bölgesel ayarlara bağlı olarak yerel ayarda bir dizi olarak haftanın geçerli gününü verir.

Sadece bir hafta günü numarası almak için NSCalendar sınıfını kullanmanız gerekir:

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

14
Ve tüm hafta içi günlerin isimlerini almak için kullanabilirsiniz [dateFormatter weekdaySymbols](ve benzerlerini), bu da Pazar ile 0. endekste başlayan NSStrings
— NSArrayını döndürür.

Tamam, haftanın gününü Pazar ile değil de Pazartesi ile nasıl başlayabilirim?
— Vladimir Stazhilov

2
@VovaStajilov muhtemelen şu soru: stackoverflow.com/questions/1106943/… yardımcı olacaktır. Temel olarak, takvimin ilk weekDay gününü pazartesi olarak ayarlamanız gerekir ([takvim setFirstWeekday: 2])
— Vladimir

1
ilk NSLog, haftanın günü için gerçekçi olmayan, çok büyük bir sayı olan 475221968'i döndürür. . .
— coolcool1994

Tamam, @Vladimir, ayarladım [gregorian setFirstWeekday:2];ve 01/06/2015 Pazartesi için 2 ( [components weekday]) aldım . Neden? - Cevabı burada
— new2ios

18

Sadece şu üç satırı kullanın:

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


3
CFAbsoluteTimeGetDayOfWeek, iOS 8'de kullanımdan kaldırılmıştır. CFCalendar'ı kullanmanın alternatif bir yolu var mı?
— Jordan Smith

15

Buradaki yanıtların çoğu kullanımdan kaldırılmıştır. Bu, iOS 8.4'ten itibaren çalışır ve size haftanın gününü bir dizi ve bir sayı olarak verir.

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
Bir yan not olarak - Çünkü weekdaybileşen NSCalendarbir olduğunu NSInteger, sen döküm gerekecektir [comps weekday]bir etmek inteğer gerekiyorsa, aksi takdirde bu ilgili bir uyarı gösterecektir.
— mylogon

10

İşte Swift 3'te bunu nasıl yapacağınız ve yerelleştirilmiş bir gün adı alacağınız ...

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

Swift 3'te NSCalendar yerine Takvim kullanılmalıdır.
— 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

Basit (Gregoryen) bir haftanın günü endeksine ihtiyacım vardı, burada 0 = Pazar ve 6 = Cumartesi model eşleştirme algoritmalarında kullanılacak. Buradan, indeksi kullanarak bir diziden gün adını aramak basit bir meseledir. Tarih biçimlendiricileri veya NSCalendar veya tarih bileşeni manipülasyonu gerektirmeyen bulduğum şey şu:

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

İşte Swift 3 için güncellenmiş kod

Kod:

let calendar = Calendar(identifier: .gregorian)

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

Olayın adını String olarak yazdırmak için:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

Bu konunun gerçekten yararlı olduğunu düşünüyorum, bu yüzden Swift 2.1 uyumlu bazı kodlar gönderiyorum .

extension NSDate {

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

}

Arayabileceğiniz her yerde:

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

Swift 3.0

@ Delta2flat'ın önerdiği gibi, kullanıcıya özel format belirleme olanağı sağlayan yanıtı güncelliyorum.

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

}

bu yerelleştirilmiş mi? ya istediğiniz ülke "14 Aralık Pazartesi" veya "14 Pazartesi Aralık" kullanmak isterse? orada ele alınmalı
— delta2flat

Merhaba @ delta2flat. Evet, format yerelleştirildi. Btw Cevabı güncelledim: artık kullanıcı özel biçim belirleyebilir
— Luca Davanzo

Harika - Objective-C / Cocoa Touch'ın dizeleri yerel ayara göre akıcı bir şekilde yerelleştirmede oldukça güçlü olduğunu buldum.
— delta2flat

Swift üç uzantınız NSDate değil Tarih olmalıdır.
— Leon


1

Bu şekilde Swift'de çalışır:

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

Ardından hafta içi günlerini elde edilen sayılara atayın.


1
NSDate () GMT + 0 için geçerli tarihi döndürür değil mi? Örneğin NSDate'i burada kullanıyorsunuz, yoksa takvim bileşeni geçerli yerel ayarı ve zaman kaymasını otomatik olarak algılayacak mı?
— Dima Deplov

0

Haftanın bir gününü alma konusunda oldukça tuhaf bir sorun yaşadım. Sadece ilk Hafta Günü ayarı yeterli değildi. Saat dilimini ayarlamak da gerekliydi. Çalışma çözümüm şuydu:

 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: Haftanın günlerini tek satırda alın. ( neoscribe cevabına göre )

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

Haftanın gününü biçimlendirmek için kullanabileceğimiz üç sembol vardır:

  • E
  • e
  • c

Aşağıdaki iki belge size yardımcı olabilir.

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:

kalıbınızı bu web sitesinde test edebilirsiniz:

http://nsdateformatter.com/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.