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.