ฉันจะรับวันในสัปดาห์กับ Foundation ได้อย่างไร?


คำตอบ:


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

แสดงวันในสัปดาห์ปัจจุบันเป็นสตริงในโลแคลโดยขึ้นอยู่กับการตั้งค่าภูมิภาคปัจจุบัน

ในการรับหมายเลขวันในสัปดาห์คุณต้องใช้คลาส NSCalendar:

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

14
และเพื่อให้ได้ชื่อของวันธรรมดาทั้งหมดคุณสามารถใช้[dateFormatter weekdaySymbols](และคล้ายกัน) ซึ่งจะส่งคืน NSArray ของ NSStrings โดยเริ่มต้นด้วยวันอาทิตย์ที่ดัชนี 0
บีทสตรา

เอาล่ะฉันจะให้วันของสัปดาห์เริ่มต้นด้วยวันจันทร์ไม่ใช่วันอาทิตย์ได้อย่างไร
Vladimir Stazhilov

2
@VovaStajilov อาจเป็นคำถามนี้: stackoverflow.com/questions/1106943/…จะช่วยได้ โดยทั่วไปคุณต้องตั้งค่าสัปดาห์แรกของปฏิทินวันนี้เป็นวันจันทร์ ([ปฏิทิน setFirstWeekday: 2])
Vladimir

1
NSLog แรกส่งคืน 475221968 ซึ่งเป็นตัวเลขที่ไม่สมจริงและมีค่ามากสำหรับวันในสัปดาห์ . .
coolcool1994

โอเค @ วลาดิเมียร์ฉันตั้งค่า[gregorian setFirstWeekday:2];และสำหรับวันจันทร์ที่ 01/06/2558ฉันได้รับ 2 ( [components weekday]) ทำไม? - หาคำตอบได้ที่นี่
new2ios

18

เพียงใช้สามบรรทัดนี้:

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

3
ฉันชอบ แต่นั่นแทบจะนับว่าเป็นความสับสนสำหรับนักพัฒนาใหม่บางคน (ซึ่งอาจเป็นโบนัสชั่วร้าย);)
David Rönnqvist

3
CFAbsoluteTimeGetDayOfWeek เลิกใช้แล้วใน iOS 8 มีวิธีอื่นในการใช้ CFCalendar หรือไม่
Jordan Smith

15

หลายคำตอบที่นี่เลิกใช้งานแล้ว ใช้งานได้กับ iOS 8.4 และให้วันในสัปดาห์เป็นสตริงและเป็นตัวเลข

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
หมายเหตุด้านข้าง - เนื่องจากweekdayส่วนประกอบของNSCalendaris an NSIntegerคุณจะต้องส่ง[comps weekday]ไปยัง an intหากต้องการมิฉะนั้นจะแสดงคำเตือนเกี่ยวกับสิ่งนี้
mylogon

10

นี่คือวิธีที่คุณทำใน Swift 3 และรับชื่อวันที่แปลเป็นภาษาท้องถิ่น ...

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

ใน Swift 3 ควรใช้ปฏิทินแทน 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

ฉันต้องการดัชนีวันธรรมดา (เกรกอเรียน) ในสัปดาห์โดยที่ 0 = วันอาทิตย์และ 6 = วันเสาร์เพื่อใช้ในอัลกอริทึมการจับคู่รูปแบบ จากนั้นเป็นเรื่องง่ายๆในการค้นหาชื่อวันจากอาร์เรย์โดยใช้ดัชนี นี่คือสิ่งที่ฉันคิดขึ้นมาซึ่งไม่ต้องการการจัดรูปแบบวันที่หรือ NSCalendar หรือการจัดการองค์ประกอบวันที่:

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

นี่คือรหัสที่อัปเดตสำหรับ Swift 3

รหัส:

let calendar = Calendar(identifier: .gregorian)

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

ในการพิมพ์ชื่อเหตุการณ์เป็น String:

 let dateFromat = DateFormatter()

datFormat.dateFormat = "EEEE"

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

2

ฉันคิดว่าหัวข้อนี้มีประโยชน์จริงๆดังนั้นฉันจึงโพสต์โค้ดที่เข้ากันได้กับSwift 2.1

extension NSDate {

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

}

ทุกที่ที่คุณสามารถโทร:

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

Swift 3.0

ตามที่ @ delta2flat แนะนำฉันอัปเดตคำตอบให้ผู้ใช้สามารถระบุรูปแบบที่กำหนดเองได้

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

}

เป็นภาษาท้องถิ่นหรือไม่ จะเป็นอย่างไรหากประเทศที่คุณต้องการใช้ "14 ธันวาคมวันจันทร์" หรือ "14 วันจันทร์ธันวาคม" มันควรจะจัดการในนั้น
delta2flat

สวัสดี @ delta2flat ใช่รูปแบบเป็นภาษาท้องถิ่น Btw ฉันได้อัปเดตคำตอบ: ตอนนี้ผู้ใช้สามารถระบุรูปแบบที่กำหนดเองได้แล้ว
Luca Davanzo

เยี่ยมมาก - ฉันพบว่า Objective-C / Cocoa Touch นั้นค่อนข้างทรงพลังด้วยการแปลสตริงตามสถานที่อย่างลื่นไหล
delta2flat

ส่วนขยาย Swift 3 ของคุณควรเป็นวันที่ไม่ใช่ NSDate
Leon

1

คำตอบของ Vladimir ทำงานได้ดีสำหรับฉัน แต่ฉันคิดว่าฉันจะโพสต์ลิงก์ Unicode สำหรับสตริงรูปแบบวันที่

http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns

ลิงก์นี้มีไว้สำหรับ iOS 6 ส่วน iOS เวอร์ชันอื่น ๆ มีมาตรฐานที่แตกต่างกันซึ่งสามารถพบได้ในเอกสาร X-Code


1

วิธีนี้ทำงานใน Swift:

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

จากนั้นกำหนดวันธรรมดาให้กับตัวเลขผลลัพธ์


1
NSDate () ส่งกลับวันที่ปัจจุบันสำหรับ GMT + 0 ใช่ไหม ตัวอย่างเช่นคุณใช้ NSDate ที่นี่หรือส่วนประกอบปฏิทินจะตรวจจับตำแหน่งปัจจุบันและการเปลี่ยนเวลาโดยอัตโนมัติ?
Dima Deplov

0

ฉันมีปัญหาแปลก ๆ เกี่ยวกับการรับวันในสัปดาห์ เฉพาะการตั้งค่า firstWeekday ไม่เพียงพอ นอกจากนี้ยังจำเป็นต้องกำหนดเขตเวลาด้วย โซลูชันการทำงานของฉันคือ:

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

มีสามสัญลักษณ์ที่เราสามารถใช้เพื่อจัดรูปแบบวันในสัปดาห์:

เอกสารสองฉบับต่อไปนี้อาจช่วยคุณได้

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

การสาธิต:

คุณสามารถทดสอบรูปแบบของคุณบนเว็บไซต์นี้:

http://nsdateformatter.com/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.