长日期(UNIX 日期)问题

Long Date (UNIX Date) issues

问题如下: 应用程序的快速详细信息:根据日期对数据进行排序(升序)。

Web 服务的 UNIX 日期/长日期,格式为 JSON(13 位数字)。解析长日期时,我得到一个无效的日期值。

长日期:1428498595000 转换日期:Sun, 26 Apr 47237 13:16:40(解析后) [通知年份]

使用在线转换器时(示例):http://www.onlineconversion.com/unix_time.htm,将再现相同的输出。 我的目的是让日期按升序排序,但不幸的是,由于显示的年份无关紧要,因此无法排序。

长日期 1428498595(在手动删除三个零以在网站上进行测试后):2015 年 4 月 8 日,星期三 13:09:55 GMT(这是需要显示的正确日期)

任何人都可以帮助我了解如何手动删除最后三个零吗? [将解析后的数据存储在SQLite中,然后在UITableView中生成存储的数据]

这是在 AppDelegate

+(NSString * )convertUnixTime_to_SytemTime :(NSTimeInterval )timeInterval
{
    NSDate * convertedDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"YYYY-MM-DD";
    NSTimeZone *localTime = [NSTimeZone systemTimeZone];
    [dateFormatter setTimeZone:localTime];
    NSString *timeStamp = [dateFormatter stringFromDate:convertedDate];
    return timeStamp;
}

这在代码里

data.News_LastModifiedDate = [AppDelegate convertUnixTime_to_SytemTime:[[subcomponents objectAtIndex:2] doubleValue]];

在此先致谢。

您的时间戳以毫秒为单位。只需将其除以 1000 即可得到正确的 date/time.

data.News_LastModifiedDate = [AppDelegate convertUnixTime_to_SytemTime:[[subcomponents objectAtIndex:2] doubleValue]/1000];

应该适合你。

date/time 是自 UNIX 纪元以来的毫秒数,而不是秒数。您可以除以 1000.0 以保留小数秒(如果它们曾经出现):

NSTimeInterval seconds = (NSTimeInterval)1428498595000 / 1000.0;

编辑。要解决您问题的其他方面:

Storing the parsed data in SQLite and then producing the stored data in UITableView

按原样存储;作为 64 位 int.

+(NSString * )convertUnixTime_to_SytemTime :(NSTimeInterval )timeInterval

该方法不会将UNIX时间转换为系统时间;它将日期格式化为字符串(从外观上看是错误的)。算了,只用第一行代码:

NSDate * convertedDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

其中timeInterval是上面转换成秒的原始数字。您唯一需要将日期作为字符串的时间是在呈现期间,而不是在处理期间。

每当您阅读 JSON 数据时,应该有一个 API 描述告诉您什么数据以何种形式传递。你会阅读 API 描述并做任何需要做的事情。如果没有API描述,你就随便吧。

当您从 JSON 数据中读取日期时,您应该首先将找到的任何内容转换为 NSDate*。 JSON 没有内置日期类型。它有一个标准的日期格式,使用 RFC3339,但你的 JSON 不这样做。显然它使用自 1970 年以来以毫秒为单位的 UTC,存储为整数。 JSON 解析器会将此 return 作为 NSNumber。幸运的是,这很容易处理:

NSNumber* dateAsNumber = "whatever is needed to extract the integer";
NSTimeInterval dateAsInterval = [dateAsNumber doubleValue] / 1000;
NSDate* dateAsDate = [NSDate dateWithTimeIntervalSince1970: dateAsInterval];

您不应该将 NSDate 转换为其他任何东西。 NSDate 是处理 iOS 日期的标准类型。 CoreData 会处理它。如果直接使用 SQL ,在存储到数据库之前和从数据库加载之后转换它,并在其他地方使用 NSDate。

顺便说一句。什么是系统时间?如果你使用像 convertUnixTime_to_SytemTime 这样的方法名称,我会非常担心,因为没有两个人会同意系统时间是什么。而且您的方法没有 return 系统时间,它 return 是转换为字符串的东西。