菜鸟教程小白 发表于 2022-12-12 10:37:48

ios - 如何获取相对于 GMT 以外的时区的 NSCalendarComponent 值?


                                            <p><p>为什么以下标记的断言会失败?我只是在中欧的一台主机上运行这个单元测试。因此 <code>NSCalendar.currentCalendar.timeZone</code> 是 CEST,即 GMT+0200。 <code>NSDateComponents</code> 返回此时区,但其其他值(例如年份等)显然与 GMT 相关。如何获取与 CEST 相关的值?</p>

<pre><code>- (void)test {
    NSDateFormatter *dateFormatter = [ init];
    dateFormatter.dateFormat = @&#34;yyyy-MM-dd&#39;T&#39;HH:mmZZZ&#34;;
    dateFormatter.timeZone   = ;
    XCTAssertEqual(2 * 60 * 60, dateFormatter.timeZone.secondsFromGMT, @&#34;&#34;);

    NSDate *time = ; // midnight on a Wednesday

    NSCalendar *calendar = NSCalendar.currentCalendar; // i.e. CEST
    XCTAssertEqual(2 * 60 * 60, calendar.timeZone.secondsFromGMT, @&#34;&#34;);

    NSDateComponents *components = [calendar components: NSYearCalendarUnit |
                                                         NSMonthCalendarUnit |
                                                         NSDayCalendarUnit |
                                                         NSWeekdayCalendarUnit |
                                                         NSHourCalendarUnit |
                                                         NSMinuteCalendarUnit |
                                                         NSTimeZoneCalendarUnit
                                             fromDate:time];

    XCTAssertEqual(components.year, 2014, @&#34;&#34;); // fails with 2013
    XCTAssertEqual(components.month, 1, @&#34;&#34;); // fails with 12
    XCTAssertEqual(components.day, 1, @&#34;&#34;); // fails with 31
    XCTAssertEqual(components.weekday, 4, @&#34;&#34;); // fails with 3 (Tuesday)
    XCTAssertEqual(components.hour, 0, @&#34;&#34;); // fails with 23
    XCTAssertEqual(components.minute, 0, @&#34;&#34;); // succeeds
    XCTAssertEqual(components.timeZone.secondsFromGMT, 2 * 60 * 60, @&#34;&#34;); // succeeds (CEST)
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>NSCalendar.currentCalendar.timeZone</code> <em>现在是 CEST 或 GMT+02</em>,因为夏令时现在在您所在的时区有效。但是在 2014-01-01,夏令时没有激活。因此,该日期的所有转换都使用 GMT+01 偏移量完成。</p>

<p>这就是你的情况:</p>

<ul>
<li><p>字符串“2014-01-01T00:00+0200”被转换为<code>NSDate</code>“2013-12-31 22:00:00 +0000”,因为您明确指定输入字符串中的 GMT 偏移量“+0200”。
因此,将 <code>dateFormatter.timeZone</code> 设置为“CEST”无效。</p></li>
<li><p><code>NSDate</code> "2013-12-31 22:00:00+0000"被转换为日期组件,使用您的
当前日历。由于 <em>该日期</em> 的 GMT 偏移量是“GMT+0100”,因此您会得到
对应“2013-12-31 23:00:00+0100”的日期组件。</p></li>
</ul>

<p>如果你用</p>进行计算

<pre><code>NSDate *time = ;
</code></pre>

<p>那么测试成功。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何获取相对于 GMT 以外的时区的 NSCalendarComponent 值?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24464843/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24464843/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何获取相对于 GMT 以外的时区的 NSCalendarComponent 值?