长日期(UNIX日期)问题

时间:2015-05-29 13:19:10

标签: ios objective-c date nsdate

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

来自Web服务的UNIX日期/漫长日期,采用JSON格式(13位数字)。解析长日期时,我得到的日期值无效。

长日期:1428498595000 转换日期:太阳,4月26日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]];

非常感谢。

3 个答案:

答案 0 :(得分:2)

日期/时间是自UNIX纪元以来的毫秒数,而不是秒。您可以除以1000.0以保持小数秒(如果它们出现):

NSTimeInterval seconds = (NSTimeInterval)1428498595000 / 1000.0;

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

  

将解析后的数据存储在SQLite中,然后生成存储的数据   在UITableView

按原样存放;作为64位int

  

+(NSString *)convertUnixTime_to_SytemTime:(NSTimeInterval)timeInterval

此方法不会将UNIX时间转换为系统时间;它将日期格式化为字符串(错误地看起来像)。忘了它,只使用第一行代码:

NSDate * convertedDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

其中timeInterval是如上所述转换为秒的原始数字。您希望将日期作为字符串的唯一时间是在演示期间,而不是在处理过程中。

答案 1 :(得分:0)

每当您阅读JSON数据时,都应该有一个API描述,告诉您哪种数据以哪种形式传递。您将阅读API描述并做任何需要做的事情。如果没有API描述,您可以尽力而为。

当您从JSON数据中读取日期时,您应该首先将您找到的任何内容转换为NSDate *。 JSON没有内置日期类型。它使用RFC3339具有日期的标准格式,但您的JSON不会这样做。显然它自1970年以来以毫秒为单位使用UTC,存储为整数。 JSON解析器将此值作为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。

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

答案 2 :(得分:0)

您的时间戳以毫秒为单位。只需将其除以1000即可获得正确的日期/时间。

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

应该适合你。