Objective c 格式RFC3339日期

Objective c 格式RFC3339日期,objective-c,datetime,rfc3339,Objective C,Datetime,Rfc3339,我从API收到以下字符串格式的日期 2015-04-18 06:08:28.000000 我希望日期的格式为d/M/yyyy 我尝试了以下方法 NSString *datevalue = (NSString*)value; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"d/M/yyyy"]; NSDate *date = [formatter dateFromSt

我从API收到以下字符串格式的日期

2015-04-18 06:08:28.000000
我希望日期的格式为
d/M/yyyy

我尝试了以下方法

NSString *datevalue = (NSString*)value;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"d/M/yyyy"];
NSDate *date =  [formatter dateFromString:datevalue];
NSString *currentDate = [formatter stringFromDate:date];
这将返回零,可能的问题是什么,或者如何在objective-c中设置这些日期的格式


谢谢。

您不能使用相同的格式化程序读取和写入日期字符串,因为它们是不同的。输入日期的格式不正确

// input string date: 2015-04-18 06:08:28.000000
// [formatter setDateFormat:@"d/M/yyyy"]; // incorrect
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"]; 
下面是示例代码

//
//  main.m
//  so29732496
//
//  Created on 4/19/15.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Hello, World!");

        NSString *dateStringFromAPI = @"2015-04-18 06:08:28.000000";
        NSString * const kAPIDateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";

        // convert API date string
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:kAPIDateFormat];
        NSDate *apiDate =  [formatter dateFromString:dateStringFromAPI];


        // now if I was output the api date to another format
        // I have to change the formatter
        [formatter setDateFormat:@"dd/M/yyyy"];
        NSString *currentDate = [formatter stringFromDate:apiDate];

        NSLog(@"Current Date: %@", currentDate);
    }
    return 0;
}
//
//main.m
//so29732496
//
//创建于2015年4月19日。
//
#进口
int main(int argc,const char*argv[]{
@自动释放池{
NSLog(@“你好,世界!”);
NSString*dateStringFromAPI=@“2015-04-18 06:08:28.000000”;
NSString*const kAPIDateFormat=@“yyyy-MM-dd HH:MM:ss.SSSS”;
//转换API日期字符串
NSDateFormatter*格式化程序=[[NSDateFormatter alloc]init];
[格式化程序setDateFormat:kAPIDateFormat];
NSDate*apiDate=[formatter dateFromString:dateStringFromAPI];
//现在,如果将api日期输出为另一种格式
//我必须更改格式化程序
[格式化程序setDateFormat:@“dd/M/yyyy”];
NSString*currentDate=[formatter stringFromDate:apiDate];
NSLog(@“当前日期:%@”,当前日期);
}
返回0;
}

只想补充一下Black Frog的答案:正如他所说的,读/写需要不同的格式化程序

但是,正确的格式应为:

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
根据苹果公司的文档,分数秒的格式应为“S”

请看这里:

这里还有一个完成任务的示例:

    NSString *datevalue = @"2015-04-18 06:08:28.000000";
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
    NSDate *date =  [formatter dateFromString:datevalue];
    [formatter setDateFormat:@"dd/MM/yyyy"];
    NSString *currentDate = [formatter stringFromDate:date];

    NSLog(@"%@",date);
    NSLog(@"%@",currentDate);

对于将API日期转换为
NSDate
对象的日期格式化程序,应使用
yyyy-MM-dd HH:MM:ss.sssss
格式字符串,如其他人所述。但是,你也要考虑<代码>时区< /代码>和<代码>区域> <代码>该格式化程序的属性。< /P>
  • 通常RFC 3339日期以GMT交换。请使用API确认这一点,但通常是GMT/UTC/Zulu。如果是这样,您可能还希望显式设置时区:

    formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    
    但请确认API所期望的时区

  • 一个更微妙的问题是如何处理使用非公历的用户

    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    
有关更多信息,请参阅苹果


显然,这些
dateFormat
timeZone
locale
属性只用于将API日期字符串转换为
NSDate
对象。然后,当为最终用户输出日期时,您将使用一个单独的格式化程序,默认为标准的
时区
区域设置
属性,并为输出使用所需的任何
日期格式
字符串。(坦白地说,我一般不建议用户输出格式化程序使用
dateFormat
string,而只是使用
dateStyle
timeStyle
属性的适当值。)

我使用了错误的格式化程序达数毫秒。是的,就像我在回答中写的那样。如果这对你有帮助@Ibrahimazharmar,我会很感激将答案标记为已被接受,因为这样面对同样问题的人可以轻松找到解决方法。但我的意思是你有8000个信誉点,我想你自己就知道,只是提醒一下。你对API的日期格式有控制权吗?RFC 3339/ISO 8601日期通常在末尾包含一个
Z
(以明确它是GMT/UTC/Zulu)。通常在日期和年份之间有一个
T
。您可以使用您想要的任何格式,但常见的约定是
2015-04-18T06:08:28.000000Z
。用于读取字符日期的格式字符串应该与您正在读取的字符串模糊不清!!谢谢@Rob,我已经控制了API服务器,我来看看