当前位置: 首页 > 知识库问答 >
问题:

NSDateComponents将UTC日期转换为本地时区,使“今天”nsdate比较混乱

穆城
2023-03-14

我试图使用NSDateComponents来测试动态日期是否发生在“今天”。我使用它提取年/月/日,然后比较两个NSDATE的值。理论上这应该行得通。我在东海岸,所以东部时间,协调世界时-5。

当前实际时间:美国东部时间12:40:53

以下是正确的NSDATED(以UTC表示)。时间是正确的UTC:

  • 当前[NSDate日期]:2016-01-19 17:40:53+0000
  • 活动NSdate:2016-01-19 00:00:00+0000
2016-1-19 12:40:53 (America/New_York (EST) offset -18000), 
2016-1-18 19:0:0 (America/New_York (EST) offset -18000)

代码:

NSDateComponents *current = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date];
NSDateComponents *activity = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date];

// attempt to set timezones to UTC manually, doesn't change anything   
activity.calendar = [NSCalendar currentCalendar];
activity.calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

current.calendar = [NSCalendar currentCalendar];
current.calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];


NSLog(@"%ld-%ld-%ld %ld:%ld:%ld (%@), %ld-%ld-%ld %ld:%ld:%ld (%@)", (long)[current year],(long)[current month], (long)[current day], (long)[current hour], (long)[current minute], (long)[current second], [current timeZone].description, (long)[activity year], (long)[activity month], (long)[activity day],(long)[activity hour], (long)[activity minute], (long)[activity second],[current timeZone].description);

if([current day] == [activity day] &&
           [current month] == [activity month] &&
           [current year] == [activity year] &&
           [current era] == [activity era]) {

           // do something if activity on current day
}

共有1个答案

宦源
2023-03-14

您正在更改NSDateComponents的时区。但您希望在调用组件(或调用NScalendar日检查例程)之前更改日历的时区,例如:

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

if ([calendar isDate:_date inSameDayAsDate:activityModel.date]) {
    NSLog(@"same");
} else {
    NSLog(@"diff");
}

但如果当地时间是2016-01-19 21:00:00-0500(即20日,协调世界时)呢。你想让它说它和你的例子中的活动日期也是同一天吗?如果是这样,那么您实际上是说您希望对_date使用本地日历,对activitymodel.date使用UTC,例如:

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];

NSDateComponents *current = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date];

calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

NSDateComponents *activity = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date];

if ([current day] == [activity day] && [current month] == [activity month] && [current year] == [activity year] && [current era] == [activity era]) {
    NSLog(@"same");
} else {
    NSLog(@"diff");
}
 类似资料:
  • 问题内容: 我从服务器获取UTC时区的字符串日期,我需要将其转换为本地时区。 我的密码: 此打印- utc:2015-04-01T11:42:00.269Z,日期:可选(2015-04-01 11:42:00 +0000) 如果我删除 它打印 utc:2015-04-01T11:42:00.269Z,日期:可选(2015-04-01 08:42:00 +0000) 我的当地时区是UTC +3,在第

  • 问题内容: 我从我的API获取此日期字符串: 但是此日期为UTC格式,我想将其转换为当地时间,该怎么办? 我尝试了这个: 但是它返回了这个错误: 问题答案: 您的日期格式模式错误。改成: 有关更多信息,请参见SimpleDateFormat的javadoc。

  • 问题内容: 从服务器上,我得到了这种格式的datetime变量:它是UTC时间。我想使用JavaScript将其转换为当前用户的浏览器时间。 如何使用JavaScript或jQuery完成此操作? 问题答案: 在将字符串转换为javascript中的日期之前,将’UTC’附加到字符串中:

  • 问题内容: 我已经为此战斗了一段时间。我正在尝试将纪元转换为日期对象。时代以UTC发送给我。每当您经过一个纪元时,它就会假定它是本地纪元。我尝试创建一个UTC对象,然后使用它来将其调整为适当的纪元,但是似乎有用的唯一方法是字符串对我没有帮助。如果我将该字符串传递给新日期,则应该注意它是UTC,但不是。 我的下一个尝试是尝试获取本地当前时间段与UTC当前时间段之间的差异,但是我也无法做到这一点。 它

  • 我想把这个2021年1月20日20:10:14转换成yyyy-MM-dd'T'HH:MM:ss格式。Android系统中的SSS'Z'。目前我正在使用函数,但当我转换为本地格式时,我没有得到原始时间

  • 问题内容: 我使用以下方式将UTC日期存储到数据库中: 然后我要将保存的UTC日期转换为客户的本地时间。 我怎样才能做到这一点? 谢谢 问题答案: 并且都使用服务器除非被覆盖本地时区; 您可以覆盖与一起使用的时区。