在swift中从字符串到日期的转换返回nil

时间:2017-03-13 03:05:39

标签: ios swift nsdateformatter

我在swift 3中将字符串转换为日期时遇到问题。这是我的代码,它在转换时返回一个nil值。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEE, dd MMM yyyy hh:mm:ss +zzzz"
dateFormatter.locale = Locale.init(identifier: "bg_BG")

let recdate = dateFormatter.date(from:"Fri, 10 Mar 2017 15:03:03 +0530")!;`

2 个答案:

答案 0 :(得分:7)

您为小时和时区设置了错误的格式说明符。使用此:

dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss Z"
dateFormatter.locale = Locale(identifier: "en_US")
  • hh表示12小时格式,因此没有小时数15.使用HH代替
  • +zzzz是无效的时区说明符。请改用Z
  • 除非周五缩短为保加利亚语Fri,否则请使用英语区域设置

答案 1 :(得分:1)

你有几个问题,首先,正如Code Different指出的那样,你需要使用HH来阅读24小时。但是,你也指定了一个语言环境,这意味着“单词”部分必须是保加利亚语,而不是英语。保留默认语言似乎工作正常:

shouldComponentUpdate

如果您使用保加利亚的日期和月份名称,您的格式应该有效。

#include<string.h>
#include<iostream>
#include<ctype.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

using namespace std;
int makearg(char s[], char**args[]);

int main(int argc, char *argv[])
{
    char **argIn;
    int argCount;
    int pos = 0;
    char str[500];
    pid_t pid = fork();

    for(int i = 0; i < 4; i++)
    {
            if(pid == 0)
            {
                while(fgets(str, 500, stdin) != NULL)
                    {
                        cout << "String loaded: " << str;
                        argCount = makearg(str, &argIn);
                execvp(argIn[0],argIn); //nothing exec
//              execl(argIn[0],argIn[0],argIn[1],argIn[2],(char*)NULL); //exec but requires index. 
        else if(pid < 0)
        {
                   perror("fork() error");
                   exit(-1);
        }
        else if(pid > 0)
        {
            cout << "Parent waiting" << endl;
            wait(NULL);
        }
    }
    return 0;
}



int makearg(char s[], char**args[])
{
    int counter = 1;
    int tokenLen = 1;
    int i = 0;
    int j = 0;
    int k = 0;
    char arg1[50];
    char * arg2;

    strcpy(arg1, s);
    //Count white space.
    while (arg1[j] != '\0')
    {
        if (arg1[j] == ' ' || arg1[j] == '\0' || arg1[j] == '\n')
        {
            counter++;
        }
        j++;
    }

    //Allocate the number of rows to be pointed to.
    args[0] = (char**) malloc(counter + 1);
    if(args[0] == NULL)
        exit(1);


    //Allocate the size of the c string arrays
    j = 0;
    while(arg1[j] != '\0')
    {
        if (arg1[j] == ' ' || arg1[j] == '\0' || arg1[j] == '\n')
        {
            (*args)[i] = (char*)(malloc(tokenLen));
            if((*args)[i] == NULL)
                exit(1);

            tokenLen = 0;
            i++;
        }

        j++;
        tokenLen++;
    }

    (*args)[i] = (char*)(malloc(tokenLen));
    if ((*args)[i] == NULL)
        exit(1);

    //reset values
    i = 0;
    j = 0;

    //Set arg2 to point to args row head. Transfer values from arg1 to arg2.
    arg2 = ((*args)[i]);
    while(arg1[j] != '\0')
    {
        if (arg1[j] != ' ' && arg1[j] != '\0' && arg1[j] != '\n')
        {
            arg2[k] = arg1[j];
            k++;
        }
        else
        {
            arg2[k] = '\0';
            i++;
            k = 0;
            arg2 = ((*args)[i]);
        }
        j++;

    }

    arg2[k] = '\0';

    if (counter < 1)
    {
        return -1;
    }

    return counter;
}