0

我试图找出我们现在有多少毫秒。我找不到以毫秒为单位返回时间而忽略日期的方法,所以我想我可以根据 timeIntervalSince 1970 方法返回的值来计算它。

我这样做了:

NSLog(@"%f", [[NSDate date] timeIntervalSince1970]);
2013-05-21 16:29:09.453 TestApp[13951:c07] 1369171749.453490

现在我的假设是,因为86,400 seconds在一天之内,我可以将这个值除以86400并得到自 1970 年以来已经过去了多少天。这样做会给我15846.8952483 days. 现在,如果我的假设成立,我已经89.52483%度过了这一天。所以 multiple24 hours by 86.52659%会给我一个当前时间的21.4859592 houror about 09:29 PM。正如你所看到的,NSLog这距离实际时间大约 5 小时,但我相信返回的时间间隔GMT会比我的时区早 5 小时。

所以我想,这到底是怎么回事,我会顺其自然,看看会发生什么。

我通过以下方式去掉小数位:

float timeSince1970 = [[NSDate date] timeIntervalSince1970]/86400.0;
timeSince1970 = timeSince1970 - (int)timeSince1970

然后计算今天到目前为止发生的毫秒数:

int timeNow = timeSince1970 * 86400000;
NSLog(@"%i", timeNow);
2013-05-21 16:33:37.793 TestApp[14009:c07] 77625000

然后我将毫秒(这似乎仍然合适)转换为NSDate

NSString *timeString = [NSString stringWithFormat:@"%d", timeNow];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"A"]
NSDate *dateNow = [dateFormatter dateFromString:timeString];
NSLog(@"%@", dateNow);
2013-05-21 16:29:09.455 TestApp[13951:c07] 2000-01-02 03:29:00 +0000

还有我的问题。它不是返回一个2000-01-01附有几个小时和分钟的日期,而是返回一个2000-01-02日期。为什么!?

编辑

我通过“删除”我在上面提到的额外 5 个小时来让它工作:

int timeNow = (timeSince1970 * 86400000) - (5 * 60 * 60 * 1000);

我不明白为什么这是必要的。如果有人可以解释,我将不胜感激。

编辑 2

也许我应该问一个关于如何完成我想要完成的任务的更基本的问题。我关心时间(例如,下午 4 点很重要,但我不太关心日期)。我一直将这些存储在由以下人员创建的 NSDates 中:

[dateFormatter setDateFormat:@"hh:mm a"];
[dateFormatter dateFromString@"04:00 PM"];

这一切似乎进展顺利。现在我想将当前时间与我保存的时间进行比较,看看它是 NSOrderedAscending 还是 NSOrderedDescending 并做出相应的响应。有没有更好的方法来实现这一点?

4

3 回答 3

5

你需要用现在NSCalendar来生成NSDateComponents,然后将开始的小时、分钟和秒都设置为0。这会给你今天的开始。然后你可以使用NSDate's-timeIntervalSinceNow方法来取回从现在到你的开始日期所经过的时间。

NSCalendar *cal = [NSCalendar currentCalendar];

NSDate *now = [NSDate date];

// BUILD UP NSDate OBJECT FOR THE BEGINNING OF TODAY
NSDateComponents *comps = [cal components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate: now];
comps.hour = 0;
comps.minute = 0;
comps.second = 0;

// USE CALENDAR TO GENERATE NEW DATE FROM COMPONENTS
NSDate *startOfToday = [cal dateFromComponents: comps];

// YOUR ELAPSED TIME
NSLog(@"%f", [startOfToday timeIntervalSinceNow]);

编辑 1

如果您只是想比较一些 NSDateObjects,您可以查看当时和现在之间的时间间隔是否为负数。如果是这样,则该日期已过去。

NSDate *saveDate = [modelObject lastSaveDate];
NSTimeInterval difference = [saveDate timeIntervalSinceNow];
BOOL firstDateIsInPast = difference < 0;
if (firstDateIsInPast) {
    NSLog(@"Save date is in the past");
}

你也可以使用compare:.

NSDate* then = [NSDate distantPast];
NSDate* now = [NSDate date];
[then compare: now]; // NSOrderedAscending
于 2013-05-21T22:01:34.130 回答
3

你的问题部分说你想计算“我们现在有多少毫秒”,然后“下午 4 点很重要,但我不太关心日期”,这使得它无法回答。

这是因为“今天”可能发生了时间变化,它改变了自午夜以来的毫秒数(例如,通过增加或减少一个小时,或者在一年结束时的闰秒等......)如果没有日期,则无法准确确定毫秒数。

现在,为了解决您编辑的问题:如果我们假设今天的日期,那么您需要使用您存储的时间并将其与今天的日期结合以获得“特定时间点”,您可以将其与当前日期和时间进行比较:

NSString *storedTime = @"04:00 PM";

// Use your current calendar 
NSCalendar *cal = [NSCalendar currentCalendar];

// Create a date from the stored time
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"hh:mm a"];
NSDate *storedDate = [dateFormatter dateFromString:storedTime];

// Break it up into its components (ie hours and minutes)
NSDateComponents *storedDateComps = [cal components:NSHourCalendarUnit | NSMinuteCalendarUnit 
                                           fromDate:storedDate];

// Now we get the current date/time:
NSDate *currentDateAndTime = [NSDate date];

// Break it up into its components (the date portions)
NSDateComponents *todayComps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                      fromDate:currentDateAndTime];

// Combine with your stored time
todayComps.hour = storedDateComps.hour;
todayComps.minute = storedDateComps.minute;

// Create a date from the comps.
// This will give us today's date, with the time that was stored
NSDate *currentDateWithStoredTime = [cal dateFromComponents:todayComps];

// Now, we have the current date and the stored value as a date, so it is simply a matter of comparing them:
NSComparisonResult result = [currentDateAndTime compare:currentDateWithStoredTime];
于 2013-05-21T23:02:51.073 回答
3

它返回 2000-01-02 日期。为什么!?

因为您dateFormatter使用当前系统区域设置的时区。

如果插入...

dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

...您的日期格式化程序将正确解释字符串。但为什么不直接创建日期:

NSDate *dateNow = [NSDate dateWithTimeIntervalSinceReferenceDate:timeNow];
于 2013-05-21T21:58:21.737 回答