Làm thế nào để tôi có được ngày trong tuần với Foundation?


Câu trả lời:


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

đầu ra ngày hiện tại trong tuần dưới dạng một chuỗi trong ngôn ngữ phụ thuộc vào cài đặt khu vực hiện tại.

Để chỉ nhận được một số ngày trong tuần, bạn phải sử dụng lớp NSCalendar:

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

14
Và để có được tên của tất cả các ngày trong tuần, bạn có thể sử dụng [dateFormatter weekdaySymbols](và tương tự), mà trả về một NSArray của NSStrings bắt đầu với chủ nhật tại chỉ số 0.
beetstra

Được rồi, làm cách nào để bắt đầu ngày trong tuần với Thứ Hai, không phải Chủ Nhật?
Vladimir Stazhilov

2
@VovaStajilov có lẽ câu hỏi này: stackoverflow.com/questions/1106943/… sẽ hữu ích. Về cơ bản, bạn cần đặt tuần đầu tiên của lịch Ngày là thứ hai ([lịch đặtFirstWeekday: 2])
Vladimir

1
NSLog đầu tiên trả về 475221968, đây là một con số không thực tế, rất lớn cho ngày trong tuần. . .
coolcool1994

Được rồi, @Vladimir, tôi đã đặt [gregorian setFirstWeekday:2];và cho Thứ Hai, ngày 01/06/2015 tôi nhận được 2 ( [components weekday]). Tại sao? - Tôi tìm thấy câu trả lời ở đây
new2ios

18

Chỉ cần sử dụng ba dòng sau:

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

3
Tôi thích nó nhưng điều đó gần như sẽ được tính là obfuscation đối với một số nhà phát triển mới (có thể là một phần thưởng ác);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek không được dùng nữa trong iOS 8. Có cách thay thế nào sử dụng CFCalendar không?
Jordan Smith

15

Nhiều câu trả lời ở đây không được dùng nữa. Tính năng này hoạt động kể từ iOS 8.4 và cung cấp cho bạn ngày trong tuần dưới dạng chuỗi và dưới dạng số.

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
Một lưu ý phụ - Bởi vì weekdaythành phần của NSCalendarlà an NSInteger, bạn sẽ cần phải truyền [comps weekday]đến một int, nếu bạn cần, nếu không nó sẽ hiển thị cảnh báo về điều này.
mylogon 22/02/16

10

Đây là cách bạn làm điều đó trong Swift 3 và nhận một tên ngày được bản địa hóa…

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

Trong Swift 3, Lịch nên được sử dụng thay vì 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

Tôi cần chỉ mục ngày trong tuần (Gregorian) đơn giản, trong đó 0 = Chủ nhật và 6 = Thứ Bảy được sử dụng trong các thuật toán đối sánh mẫu. Từ đó, việc tra cứu tên ngày từ một mảng bằng cách sử dụng chỉ mục là một vấn đề đơn giản. Đây là những gì tôi nghĩ ra không yêu cầu định dạng ngày tháng, NSCalendar hoặc thao tác thành phần ngày tháng:

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

Đây là mã cập nhật cho Swift 3

Mã:

let calendar = Calendar(identifier: .gregorian)

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

Để in tên sự kiện dưới dạng Chuỗi:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

Tôi nghĩ rằng chủ đề này thực sự hữu ích, vì vậy tôi đăng một số mã tương thích Swift 2.1 .

extension NSDate {

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

}

Mọi nơi bạn có thể gọi:

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

Swift 3.0

Như @ delta2flat đã đề xuất, tôi cập nhật câu trả lời cung cấp cho người dùng khả năng chỉ định định dạng tùy chỉnh.

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

}

cái này đã được bản địa hóa chưa? điều gì sẽ xảy ra nếu quốc gia dự định của bạn muốn sử dụng "14 tháng 12, Thứ Hai" hoặc "14 Thứ Hai tháng 12"? nó cần được xử lý trong đó
delta2flat

Xin chào @ delta2flat. Có, định dạng được bản địa hóa. Câu trả lời Btw Tôi đã cập nhật: bây giờ người dùng có thể chọn định dạng tùy chỉnh
Luca Davanzo

Tuyệt vời - Tôi thấy rằng Objective-C / Cocoa Touch khá mạnh mẽ với khả năng bản địa hóa các chuỗi theo ngôn ngữ một cách linh hoạt.
delta2flat

Phần mở rộng Swift ba của bạn phải là Ngày chứ không phải NSDate.
Leon


1

Theo cách này, nó hoạt động trong Swift:

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

Sau đó, gán các ngày trong tuần cho các số kết quả.


1
NSDate () trả về ngày hiện tại cho GMT + 0 phải không? Bạn sử dụng NSDate ở đây chẳng hạn, hay thành phần lịch sẽ tự động phát hiện ngôn ngữ hiện tại và dịch chuyển thời gian?
Dima Deplov

0

Tôi đã có một vấn đề khá lạ khi nhận được một ngày trong tuần. Chỉ thiết lập FirstWeekday là không đủ. Việc đặt múi giờ cũng rất cần thiết. Giải pháp làm việc của tôi là:

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

có ba biểu tượng chúng ta có thể sử dụng để định dạng ngày trong tuần:

  • E
  • e
  • c

Hai tài liệu sau đây có thể giúp bạn.

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

Bản giới thiệu:

bạn có thể kiểm tra mẫu của mình trên trang web này:

http://nsdateformatter.com/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.