iPhone OS:如何为特定日期创建NSDate?


Answers:


211

@Chuck的答案是正确的,并且将我引向以下代码。我想分享一下:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

7
请注意,还有setHoursetMinutesetSecond等,为更细的粒度。
devios1 2013年

19

你可以用这个

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

希望这对您有所帮助。


使用“ dateFromString”函数时要小心-我发现使用一些完全有效的日期,它会惨遭失败。有关解析日期字符串的另一种方法,请参见下面的我的文章。
Mike Gledhill

Oded Ben提到的方式也是另一种最佳方式。....NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay:10]; [comps setMonth:10]; [comp setYear:2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Kamleshwar

16

如果您要谈论的是特定的日历日期而不是UNIXy日期,则可能需要NSCalendar的日期dateFromComponents:


9

迅捷的例子

实例通常是最简单的学习方法。这里有一些例子。

现在

这是最简单的。

let currentDateTime = Date()

2017年2月20日

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1976年4月1日

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

需要更多详细信息...?

还有其他创建日期的方法。如果您想学习这些内容以及如何显示日期,请参阅我的完整答案


8

请参阅NSDate的文档。您可以使用dateFromString:的方法NSDateFormatterdateFromComponents:方法NSCalendar


我一直使用以下日期获取此日期:“ 1969-12-31 16:00:00” -0800(使用字符串中的日期)
nickthedude 2010年

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * capturedStartDate = [dateFormatter dateFromString:@“ 2001年1月2日”];NSLog(@“%@”,[capturedStartDate描述]); 输出:2010-04-05 10:49:47.688 Calendar2 [21339:207] 1969-12-31 16:00:00 -0800
nickthedude

也许您需要在格式化日期而不是简单日期上设置一些参数init
zoul 2010年

3

我在寻找这个问题的答案时找到了这个线程,但是后来我在Big Nerd Ranch Objective-C编程书中找到了一个很好的例子。归功于他们,而不是我。

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];

2

这太荒谬了,不是吗?

2013年中期,Apple 仍未提供设置NSDate值的简单方法。

在我当前的iPad项目中,我简直无法相信我必须停止一段时间才能编写自己的帮助程序类,以便从NSDate获得Year的价值。我的意思是,来吧,这是基本内容。

无论如何,这是我在项目中使用的帮助程序类,用于将字符串转换为NSDate值:

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

使用此代码,您可以使用以下方法设置NSDate值:

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

注意:此功能基于以下代码:https : //stackoverflow.com/a/3968411/391605

我的解决方案使用以下代码,但是我发现有时,它只是无法解析,并且会返回nil

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

我记得它在“ Oct 12,2012”上惨败,这就是为什么我放弃并使用了上面显示的更复杂的“ parseDateString”函数的原因。

我的意思是……要小心。

一些非常基础的NSDate函数只是无法正常工作...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.