2016-05-31 96 views
0

我在我的viewController默认位置,UIDataPicker当我的用户完成选择日期运行此代码:NSDateFormatterLongStyle字符串的NSDate

NSString *dateString = [NSDateFormatter localizedStringFromDate:[self.dataPicker date] 
                  dateStyle:NSDateFormatterLongStyle 
                timeStyle:NSDateFormatterNoStyle]; 

与该代码我可以存储在以下格式的日期:

2016年5月31日

在我的代码之后,我需要这个字符串转换成真正的日期格式,为了这个,我用鳕鱼e如下:

-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MM/dd/yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

但是这段代码返回一个空值。由于日期选择器默认设置,我的系统可以接收任何日期格式,但最终我希望它被转换为en_us格式。

我该如何解决这个问题?

+0

请参见本教程:HTTPS: //iosdevcenters.blogspot.com/2016/03/nsdateformatter-in-swift.html –

+0

'2016年5月31日'vs'MM/dd/yyyy'您是否看到相同的格式?格式“MM/dd/yyyy”与字符串格式不匹配(2016年5月31日)。 – Larme

+0

@Larme,我明白了...现在让我们将设备的语言更改为法语,格式将与2016年5月31日不同,我认为我需要将日期转换为语言环境... – Lacrifilm

回答

2

不要将日期存储为字符串;从某个参考日期以秒为单位将其存储为偏移量。

即:

uint64_t offset = (uint64_t)[[self.dataPicker date] timeIntervalSinceReferenceDate]; 
// store this 64-bit unsigned integer. 

这需要更少的空间并更快转换到/从一个NSDate对象。

您可以将偏移为NSTimeInterval(64位浮点double)如果你喜欢,但你不存储日期&时间,uint64_t应该做的......

1

格式化字符串取决于您使用的语言环境。从localizedStringFromDate文档:格式化的 当前语言环境的给定日期的

返回字符串表示使用指定的日期和时间样式。

此方法使用配置了当前默认值 设置的日期格式化程序。返回的字符串是一样的,如果你配置和 用作以下示例所示日期格式:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.formatterBehavior = NSDateFormatterBehavior10_4; 
formatter.dateStyle = dateStyle; formatter.timeStyle = timeStyle; 
NSString *result = [formatter stringForObjectValue:date]; 

意味着,你应该做下:

-(NSDate*)convertStringToDate:(NSString*)dateString { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.formatterBehavior = NSDateFormatterBehavior10_4; 
    dateFormatter.dateStyle = NSDateFormatterLongStyle; 
    dateFormatter.timeStyle = NSDateFormatterNoStyle; 
    return [dateFormatter dateFromString:dateString]; 
} 
+1

'MM'应该对应'05',而不是'May',否? – Larme

+1

对,现在如果我的用户正在使用我的应用程序与不同的位置?像法国人,日本人,葡萄牙人......这段代码可以处理? (一旦我的选择器被设置为默认) – Lacrifilm

+0

是的,格式化字符串应该取决于你用来创建日期的地区。相应地更新解决方案。 – sgl0v

1

使用此代码,

-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MMM d, yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

希望它有帮助