- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已将我的手机(实际设备,而不是模拟器)配置为位于英国伦敦,即 GMT。
当我在 NSCalendar
上设置时区时使用 localTimeZone
,与我使用 [NSTimeZone timeZoneWithAbbreviation:@"GMT"]
设置相比,它给了我 1 分 15 秒的休息时间.如果我的时区已经设置为 GMT,两者不应该给我相同的结果吗?
我注意到的另一件事是,如果我设置断点,NSDate
使用 localTimeZone
创建通过断点检查已关闭 1 分 15 秒,但 NSLog 打印正确的时间(断点显示:0000-12-30 09:01:15 UTC 但 NSLog 打印 Sat Dec 30 09:00:00 0000):
但是当我使用 [NSTimeZone timeZoneWithAbbreviation:@"GMT"]
,则断点显示正确的时间,但 NSLog
将错误的时间打印 1 分 15 秒(断点显示:0000-12-30 09:00:00 UTC 但 NSLog 打印 Sat Dec 30 08:58:45 0000):
这是我的代码以及旁边注释中的断点和 NSLog 输出:
NSLog(@"Timezone: %@",[NSTimeZone localTimeZone]);//Timezone: Local Time Zone (Europe/London (GMT) offset 0)
NSLocale *locale = [NSLocale currentLocale];
NSCalendar *myCalendar = [NSCalendar currentCalendar];
[myCalendar setLocale:locale];
[myCalendar setTimeZone:[NSTimeZone localTimeZone]];
NSLog(@"TZ: %@",myCalendar.timeZone);//TZ: Local Time Zone (Europe/London (GMT) offset 0)
NSDateFormatter *timeFormatter = [NSDateFormatter new];
[timeFormatter setDateFormat:@"h:mm a"];
[timeFormatter setLocale:locale];
[timeFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSDateComponents* dateComps = [myCalendar components:NSCalendarUnitHour|NSCalendarUnitMinute fromDate:[timeFormatter dateFromString:@"9:00 AM"]];
NSDate *myDate1 = [myCalendar dateFromComponents:dateComps];//Breakpoint shows: 0000-12-30 09:01:15 UTC
NSLog(@"myDate1: %@",myDate1); // myDate1: Sat Dec 30 09:00:00 0000
//----------------Explicitly specified timeZoneWithAbbreviation GMT:
NSCalendar *myCalendarExplicitGMT = [NSCalendar currentCalendar];
[myCalendarExplicitGMT setLocale:locale];
[myCalendarExplicitGMT setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSLog(@"TZ: %@",myCalendarExplicitGMT.timeZone);//TZ: GMT (GMT) offset 0
NSDateComponents* dateCompsUsingExplicitGMT = [myCalendarExplicitGMT components:NSCalendarUnitHour|NSCalendarUnitMinute fromDate:[timeFormatter dateFromString:@"9:00 AM"]];
NSDate *myDate2 = [myCalendarExplicitGMT dateFromComponents:dateCompsUsingExplicitGMT];//Breakpoint shows: 0000-12-30 09:00:00 UTC
NSLog(@"myDate2: %@",myDate2); // myDate2: Sat Dec 30 08:58:45 0000
最佳答案
在计算过程中,您将获得一个只有小时和分钟值的 NSDateComponents。到那时你很好。但是,要使用 NSDateFormatter,您需要转换为 NSDate(因为这是 NSDateFormatter 所需要的)。 NSDate 是一个绝对瞬间,所以它需要一个完全指定的日期来转换。它不是返回 nil,而是对 NSDateComponents 中缺少的任何字段使用默认(零)值。因此,它使用的是第 1 年(实际上是向后调整到公元前 1 年)。执行此操作时,您会看到打印为“0000”的年份。
当您使用明确的 GMT 时区时,您明确指定了偏移量,并且它基本上按预期工作。但是,当 NSDate 使用本地时区(即您的欧洲/伦敦)格式化时,它将应用该时区发生的任何历史变化,因为这是“欧洲/伦敦”所说的。 IANA time zone system NSTimeZone 使用的 , 具有相当完整的所有时区更改历史,可以追溯到时区系统本身的创建。他们忽略了 1970 年左右之前来来去去的时区,但他们试图追踪他们确实拥有的时区的历史。对于伦敦来说,他们似乎在 1847 年首次使用 GMT 作为标准时间(在创建完整时区系统之前)。不过在此之前,他们(和其他所有人)使用的是“本地标准时间”,这是该城镇所在位置的自然时间——所以对于一个经度一定程度的城镇,他们的时间会相差四分钟(1440 分钟一天,除以地球经度的 360 度,每度得到四分钟)。因此,在 1847 年之前,他们使用的是“伦敦标准时间”,与“格林威治标准时间”略有不同。查看 tzdata“欧洲”源文件,他们给出了他们在 1994 年独立文章中找到的描述:
'An old stone obelisk marking a forgotten terrestrial meridian stands
beside the river at Kew. In the 18th century, before time and longitude
was standardised by the Royal Observatory in Greenwich, scholars observed
this stone and the movement of stars from Kew Observatory nearby. They
made their calculations and set the time for the Horse Guards and Parliament,
but now the stone is obscured by scrubwood and can only be seen by walking
along the towpath within a few yards of it.'
I have a one inch to one mile map of London and my estimate of the stone's
position is 51° 28' 30" N, 0° 18' 45" W. The longitude should
be within about ±2". The Ordnance Survey grid reference is TQ172761.
[This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
关于ios - 使用 `localTimeZone` 设置 NSCalendar 的时区与使用 `timeZoneWithAbbreviation` 提供不同值之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787515/
据我了解,调用 NSLog(@"Local Time Zone %@",[[NSTimeZone localTimeZone] name]); 为您提供设备的本地时区。它给我的是“US/Central
正如标题所述,我的应用程序在客户端崩溃并通过 Parse 崩溃报告进行报告,但我无法在我这边重现它。 在模拟器和真实设备上一切正常,还从app store下载了应用程序工作完美无缺。但直到今天我仍然收
[NSTimeZone localTimeZone] 和 [NSTimeZone systemTimeZone] 有什么区别? 最佳答案 根据NSTimeZone引用 iOS,systemTimeZo
我想将日期解析为 JavaScript 日期对象。我正在使用以下内容 new Date(Date.parse('2012-08-01')) 问题是我的输入日期可以采用多种格式,解析它应该总是给我日期对
在我们的应用程序中,我们使用 NSCalendar 来处理 NSDate 对象,例如获取日期组件。 这个 NSCalendar 实例是一个单例对象,因为我们在短时间内进行了大量的日期计算,并且我们注意
在 NSTimeZone 类下,有 +localTimeZone 和 +systemTimeZone。我在 iphone 模拟器上做了一个测试,两者都返回 NSTimeZone 对象,指示相同的时区。
当我启动我的应用程序时,我将我的默认时区设置为 GMT[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT
我已将我的手机(实际设备,而不是模拟器)配置为位于英国伦敦,即 GMT。 当我在 NSCalendar 上设置时区时使用 localTimeZone ,与我使用 [NSTimeZone timeZon
我是一名优秀的程序员,十分优秀!