1

我从 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];

这将返回 NIL,可能是什么问题,或者我如何在 Objective-c 中格式化这些日期?

谢谢。

4

3 回答 3

1

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

但是正确的格式应该是:

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];

根据苹果文档,小数秒应格式化为“S”。

见这里: NSDateFormat

这里还有一个例子来完成你的任务:

    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);
于 2015-04-19T16:40:47.523 回答
1

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

// 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;
}
于 2015-04-19T16:31:44.193 回答
1

正如其他人所讨论的,您应该使用yyyy-MM-dd HH:mm:ss.SSSSSSS日期格式化程序的格式字符串将 API 日期转换为对象。NSDate但是,您还需要考虑此格式化程序的timeZonelocale属性。

  • 通常 RFC 3339 日期在 GMT 中交换。使用您的 API 确认这一点,但通常是 GMT/UTC/Zulu。如果是这样,您可能还想明确设置时区:

    formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    

    但请确认 API 期望的时区。

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

    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    

有关更多信息,请参阅 Apple技术问答 1480

显然,这些dateFormattimeZonelocale属性只是用于将 API 日期字符串转换为NSDate对象。然后在为最终用户输出日期时,您将使用单独的格式化程序,默认为标准timeZonelocale属性,并使用dateFormat您想要的任何字符串作为输出。(坦率地说,我通常不建议dateFormat对用户输出格式化程序使用字符串,而只是对dateStyleandtimeStyle属性使用适当的值。)

于 2015-04-19T17:47:21.220 回答