iPhone操作系统:如何为特定日期创建NSDate?

100

看起来很简单,但我似乎找不到方法去实现。

能够提供几种不同的方法将会非常好。

8个回答

217

@Chuck的答案是正确的,他带我找到了以下代码。我想分享一下:

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

9
注意还有 setHoursetMinutesetSecond 等方法,精确度更高。 - devios1

21

您可以使用这个

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]; [comps setYear:2010]; NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps]; - Kamleshwar
这段代码将在应用程序本地化到一个月份名称不匹配的语言时失败。你还应该使用四位数的年份以确保清晰明了。 - HangarRash

17
如果你想要根据特定的日期而不是UNIX日期来讨论,那么你可能需要使用NSCalendar的dateFromComponents:方法。

12

Swift示例

示例通常是学习的最简单方式。以下是一些示例。

现在

这个是最容易的。

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)

需要更多细节吗...?

还有其他创建日期的方式。如果你想学习这些方法,以及如何显示日期,请查看我的详细回答


9

当我使用字符串转换为日期时,我一直得到这个日期:"1969-12-31 16:00:00" -0800。 - nickthedude
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSDate *capturedStartDate = [dateFormatter dateFromString: @"Jan 2, 2001"]; NSLog(@"%@", [capturedStartDate description]);输出:2010-04-05 10:49:47.688 Calendar2[21339:207] 1969年12月31日16:00:00 -0800 - nickthedude
也许你需要在日期格式化上设置一些参数,而不是仅使用“init”? - zoul

4

我在寻找答案的过程中发现了这个帖子,但后来在我一本《大脑壳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 的年份值。我是说,拜托,这是基本的东西。

无论如何,这是我在项目中使用的辅助类,将字符串转换为 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://dev59.com/3HA75IYBdhLWcg3w0cfx#3968411 我的解决方案曾经是使用以下代码,但我发现有时它无法解析并返回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];

我记得它在“2012年10月12日”惨遭失败......这就是我放弃并使用上面展示的更复杂的“parseDateString”函数的原因。
我的意思是...要小心。
一些非常基本的NSDate函数就是不能正常工作......

-1
我用Objective-C写的。虽然不高效,但很简单。
+(NSDate *) MakeNSDate : (int) year : (int) month : (int) day : (int) hour : (int) min : (int) sec
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
    NSDate *dtRet = [dateFormatter dateFromString:[NSString stringWithFormat:@"%4d/%02d/%2d %02d:%02d:%02d", year, month, day, hour, min, sec]];
    return dtRet;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接