【问题标题】:Why is my NSDate not being formatted correctly?为什么我的 NSDate 格式不正确?
【发布时间】:2018-11-03 20:03:23
【问题描述】:

我有一个格式不正确的NSDate

我在 .h 中声明了一个UITextField

@property (weak, nonatomic) IBOutlet UITextField *datetimeTextField;

然后我有一个第 3 方 UIPicker,它选择一个日期并将其插入到提到的 TextField 中:

// Method to avoid diplaying the keyboard. 
    -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
        ActionSheetDatePicker *datePicker = [[ActionSheetDatePicker alloc]initWithTitle:@"Select Date and Time" datePickerMode:UIDatePickerModeDateAndTime selectedDate:[NSDate date] doneBlock:^(ActionSheetDatePicker *picker, id selectedDate, id origin) {

        // As you can see here it's taking the correct (non-formatted) date
        NSLog(@"Selected %@", selectedDate); // VALUE = Sat Nov 10 10:00:41 2018

        //create a date formatter
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        //set its format as the required output format
       [formatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];

        //get the output date as string
        NSString *selectedDateString = [formatter stringFromDate:selectedDate];

        self.datetimeTextField.text = selectedDateString;

        // And here I get the value I want to store in Parse stored in datetimeTextField.text

        NSLog(@"Selected After reformat %@", self.datetimeTextField.text); // VALUE = 10-11-2018 00:35:06

    } cancelBlock:^(ActionSheetDatePicker *picker) {

    } origin:self.view];
    datePicker.minuteInterval = 5;
    [datePicker showActionSheetPicker];

 return NO;
 }

当我必须调用 IBAction 将此 NSDate 存储在我的 Parse Cloud 中时,我的问题就开始了(我有一个仅接受 NSDate 的日期列。

- (IBAction)createeventAction:(id)sender{

   // Here I "catch" the value previously stored from the Picker. 
   NSString *dateString =  datetimeTextField.text; //// 07-11-2018 22:00:42 (correct format)

   // Here I convert the NSString into NSDate with the same formatting
   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
   NSDate *date = [dateFormatter dateFromString:dateString];

   // But for some reason, date prints incorrectly. 
   NSLog(@"DATE in here ====>>> %@", date); // Sat Nov 10 10:00:41 2018

 }

问题:

我想在不丢失格式的情况下将 NSString (datetimeTextField.text) 转换为 NSDate。

编辑 1:

我已经咨询了这个问题How to convert NSStrings to NSDate 的公认答案,但由于某种原因,它对我不起作用。

编辑 2:

为了更清楚:

将 NSDate 转换为 NSString 的代码。

// We have a date (not formatted) => Sat Nov 10 10:00:41 2018 
//create a date formatter
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
NSString *selectedDateString = [formatter stringFromDate:selectedDate];
self.datetimeTextField.text = selectedDateString;
// Date formatted => 10-11-2018 00:35:06

将 NSString 转换回 NSDate 的代码:

NSString *dateString =  datetimeTextField.text; // 10-11-2018 10:00:41 (correct format)
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(@"DATE in here ====>>> %@", date); // Sat Nov 10 10:00:41 2018 (not formatted. WHY?)

【问题讨论】:

  • 期待哪种格式? NSLog 总是使用类的描述方法。说明始终采用 2018 年 11 月 10 日星期六 00:35:06 格式
  • 我预计会有 dd-MM-yyyy HH:mm:ss。
  • 那你必须使用 NSLog(@"%@", [dateFormatter stringFromDate:date]);
  • 但这会返回 NSString 还是 NSDate 对象?
  • 然后你又得到了一个 NSString。日期是 NSDate 类型。这应该被您的 Parse Cloud 接受。

标签: objective-c datepicker uitextfield nsdate


【解决方案1】:

嗯,就是这样。我需要一个 NSDate,因为我要存储日期。

您似乎误解了NSDate 和您从NSDateFormatter 获得的信息之间的区别。 NSDate 只是一个以非特定格式 存储日期的类——它将信息存储在对象内部。如果要以特定格式显示日期,则需要从日期创建一个 string,然后使用 NSDateFormatter 将日期转换为以格式表示日期的字符串你需要。

如果您使用NSLog() 将日期打印到控制台,例如:

NSLog("My date is %@", myDate);

那么NSLog 将只使用日期的description 方法,它为您提供了一种日期的默认表达式。如果您想以某种特定格式记录日期,则需要使用该格式设置日期格式化程序,然后使用它:

NSLog("My formatted date is %@", [myFormatter stringFromDate:myDate]);

【讨论】:

  • 嗨,凯莱布!但我不需要将日期转换为字符串,而是相反!我已经有一个格式正确的 NSString (datetimeTextField.text) (07-11-2018 22:00:42)。我的问题是将 NSString 转换为 NSDate :)
  • 啊,我明白了。我以为您对记录的格式不满意。你在哪个时区?
  • 我在 GMT+1 :)
  • 很难看出07-11-2018 22:00:42 的输入如何导致Sat Nov 10 00:35:06 2018 的日期。与 UTC 的 1 小时时区差异解释了 2 小时 35 分钟的部分差异,夏令时可能解释了另一个小时,但很难看出 35 分钟的来源。
  • 抱歉,值是一样的。只是他们是不同的例子。我只想将 NSString 转换为 NSDate。就是这样。
【解决方案2】:

最后证明我的代码没问题。唯一的问题是我没有注意到日期在 Parse 中被声明为字符串而不是日期。

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多