NSDATE الحصول على سنة/شهر/يوم
-
02-10-2019 - |
سؤال
كيف يمكنني الحصول على العام/الشهر/يوم NSDate
كائن ، لا توجد معلومات أخرى؟ أدرك أنه من المحتمل أن أفعل هذا بشيء مشابه لهذا:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
لكن يبدو أن هذا يمثل الكثير من المتاعب لشيء بسيط مثل الحصول على ملف NSDate
عام/شهر/يوم. هل يوجد حل آخر؟
المحلول
نظرًا لأن هذا هو إجابتي الأكثر شعبية على ما يبدو ، سأحاول تعديله لاحتواء مزيد من المعلومات.
على الرغم من اسمها ، NSDate
في حد ذاته يمثل ببساطة نقطة في وقت الآلة ، وليس تاريخ. لا يوجد علاقة بين النقطة الزمنية المحددة بواسطة NSDate
وسنة أو شهر أو يوم. لذلك ، عليك الرجوع إلى التقويم. أي نقطة معينة في الوقت المناسب سوف تعيد معلومات تاريخ مختلفة بناءً العالم - أنا أفترض - نحن متحيزون قليلاً NSDate
يجب استخدامه دائمًا. NSDate
, لحسن الحظ ، هو أكثر بكثير من الحزبين.
سيتعين على التاريخ والوقت المرور NSCalendar
, ، كما ذكرت ، ولكن هناك طريقة أبسط للقيام بذلك:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
هذا يولد NSDateComponents
كائن يحتوي على اليوم والشهر والسنة من تقويم النظام الحالي لليوم الحالي. ((ملحوظة: هذا ليس بالضرورة الحالي مستخدم محدد التقويم ، فقط النظام الافتراضي واحد.)
بالطبع ، إذا كنت تستخدم تقويمًا أو تاريخًا مختلفًا ، فيمكنك تغيير ذلك بسهولة. يمكن العثور على قائمة بالتقويمات المتاحة ووحدات التقويم في NSCalendar
مرجع الفصل. مزيد من المعلومات حول NSDateComponents
يمكن العثور عليها في NSDateComponents
مرجع الفصل.
كمرجع ، الوصول إلى المكونات الفردية من NSDateComponents
سهل إلى حد ما:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
عليك فقط أن تضع في اعتبارك: NSDateComponents
لن تحتوي على معلومات صالحة لأي حقول تطلبه إلا إذا قمت بإنشائها مع هذه المعلومات الصحيحة (أي طلب NSCalendar
لتوفير تلك المعلومات مع NSCalendarUnit
س). NSDateComponents
لا تحتوي على معلومات مرجعية بحد ذاتها - إنها مجرد هياكل بسيطة تحمل أرقامًا لك للوصول إليها. إذا كنت ترغب أيضًا في الحصول على حقبة ، على سبيل المثال ، خارج NSDateComponents
, ، سيكون عليك إطعام طريقة المولد من NSCalendar
مع ال NSCalendarUnitEra
علَم.
نصائح أخرى
يمكنك الحصول على مكون منفصل من NSDate باستخدام NSDateFormatter:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];
إذا كنت ترغب في الحصول على رقم الشهر بدلاً من الاختصار ، فاستخدم "MM". إذا كنت ترغب في الحصول على أعداد صحيحة ، فاستخدم [myDayString intValue];
فقط لإعادة صياغة رمز Itai الممتاز (والعمل!) ، إليك ما يبدو عليه فئة Helper عينة ، لإرجاع عام قيمة متغير nsdate معين.
كما ترون ، من السهل بما يكفي لتعديل هذا الرمز للحصول على الشهر أو اليوم.
+(int)getYear:(NSDate*)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
return year;
}
(لا أستطيع أن أصدق أننا مضطرون إلى كتابة وظائف تاريخ iOS الأساسية مثل هذا ، في عام 2013 ...)
شيء آخر: لا تستخدم <و> لمقارنة قيمتين nsdate.
ستقبل Xcode بسعادة مثل هذا الرمز (بدون أي أخطاء أو تحذيرات) ، لكن نتائجها هي يانصيب. أنت يجب استخدم وظيفة "مقارنة" لمقارنة NSDates:
if ([date1 compare:date2] == NSOrderedDescending) {
// date1 is greater than date2
}
في Swift 2.0:
let date = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let components = calendar.components([.Month, .Day], fromDate: date)
let (month, day) = (components.month, components.day)
أنا أكتب هذه الإجابة لأن هذا هو النهج الوحيد الذي لا يعيدك اختيارات العودة من NSDateComponent
المتغيرات و/أو إجبار تلك المتغيرات (أيضًا لـ Swift 3).
سريع 3
let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)
سريع 2
let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)
مكافأة سويفت 3 نسخة ممتعة
let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)
جديد في iOS 8
OBJC
NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];
سريع
let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)
إذا كنت تستهدف iOS 8+ يمكنك استخدام الجديد NSCalendar
طرق الراحة لتحقيق ذلك بتنسيق أكثر terse.
أولا إنشاء NSCalendar
واستخدام أي شيء NSDate
مطلوب.
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
يمكنك استخراج المكونات بشكل فردي عبر component:fromDate:
NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
أو ، بشكل أكثر إيجازًا ، استخدم NSInteger
مؤشرات عبر getEra:year:month:day:fromDate:
NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];
لمزيد من المعلومات والأمثلة تحقق من أصبح التلاعب NSDate سهلاً في iOS 8. إخلاء المسئولية ، كتبت المنشور.
اعتبارًا من iOS 8.0 (و OS X 10) يمكنك استخدام مكون طريقة تبسيط الحصول على مكون تاريخ واحد مثل:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
يجب أن تجعل الأمور أكثر بساطة ونأمل أن يتم تنفيذ ذلك بكفاءة.
إذا كنت ترغب في الحصول على NSDateComponents الفردية من NSDATE ، فستحتاج بالتأكيد إلى الحل الذي اقترحه ITAI Ferber. ولكن إذا كنت تريد للانتقال من nsdate مباشرة إلى NSString ، يمكنك استخدام NSDateFormatter.
NSDate *currDate = [NSDate date];
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"%d/%d/%d", day, month, year);
هذا هو الحل في سويفت:
let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
// Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)
var (year, month, date) = (components.year, components.month, components.day)
جرب هذا . . .
قصاصة الكود:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
يمنح السنة الحالية والشهر والتاريخ
حاول القيام بما يلي:
NSString *birthday = @"06/15/1977";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSDate *date = [formatter dateFromString:birthday];
if(date!=nil) {
NSInteger age = [date timeIntervalSinceNow]/31556926;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
}
[formatter release];
سويفت 2.x
extension NSDate {
func currentDateInDayMonthYear() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "d LLLL yyyy"
return dateFormatter.stringFromDate(self)
}
}
يمكنك استخدامه كما
NSDate().currentDateInDayMonthYear()
انتاج |
6 March 2016
سريع
طريقة أسهل للحصول على أي عناصر من التاريخ كسلسلة اختيارية.
extension Date {
// Year
var currentYear: String? {
return getDateComponent(dateFormat: "yy")
//return getDateComponent(dateFormat: "yyyy")
}
// Month
var currentMonth: String? {
return getDateComponent(dateFormat: "M")
//return getDateComponent(dateFormat: "MM")
//return getDateComponent(dateFormat: "MMM")
//return getDateComponent(dateFormat: "MMMM")
}
// Day
var currentDay: String? {
return getDateComponent(dateFormat: "dd")
//return getDateComponent(dateFormat: "d")
}
func getDateComponent(dateFormat: String) -> String? {
let format = DateFormatter()
format.dateFormat = dateFormat
return format.string(from: self)
}
}
let today = Date()
print("Current Year - \(today.currentYear)") // result Current Year - Optional("2017")
print("Current Month - \(today.currentMonth)") // result Current Month - Optional("7")
print("Current Day - \(today.currentDay)") // result Current Day - Optional("10")
أفعل بهذه الطريقة ....
NSDate * mydate = [NSDate date];
NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate];
NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);
للحصول على سلسلة قابلة للقراءة البشرية (اليوم ، الشهر ، العام) ، يمكنك القيام بذلك:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];