将UTC时间转换为PST以获取夏令时?

时间:2016-03-01 18:41:57

标签: ios objective-c nsdate dst nstimezone

我的应用程序从后端获取一些时间段并将其转换为当前时区(PST)并显示。一切都在完美,直到白天节省时间才开始节省。

在iOS中有没有办法说给我这个UTC的PST日期和时间,它会自动处理夏令时。目前它转换它很好,但仍然给我一个小时。

这就是我在做的事情:

-(NSDate *) toLocalTime:(NSDate*) currentDate
{
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"US/Pacific"];
    NSInteger seconds = [tz secondsFromGMTForDate: currentDate];
    return [NSDate dateWithTimeInterval: seconds sinceDate: currentDate];
}

修改

将我的代码更改为此但仍然是相同的结果:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    dateFormatter.dateFormat = @"MM/dd/yyyy HH:mm:ss";
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSString *startDateString = [[self.slotsArray objectAtIndex:indexPath.row] objectForKey:@"StartDate"];
    NSDate *startDate = [dateFormatter dateFromString:startDateString];

    dateFormatter.dateStyle = NSDateFormatterMediumStyle;
    dateFormatter.timeStyle = NSDateFormatterMediumStyle;
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];

    NSString * dateString = [dateFormatter stringFromDate:startDate];

例如,我在3月13日显示一些时间段,当白天时间开始。在UTC中,我得到17:00的时间,相当于今天的10。但在这种情况下,实际时间是当天上午9点。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

我不知道该方法应该做什么,但NSDate没有任何时区信息,所以如果你从一个时区“调整”一个时区,你就是做错了。 NSDate的文档甚至说

  

NSDate对象封装单个时间点,独立于任何特定的日历系统或时区。

如果您有一个NSDate并且想要在给定时区的当地时间向用户展示,则可以执行以下操作:

NSDate *date = // from somewhere

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterMediumStyle;
formatter.timeStyle = NSDateFormatterMediumStyle;
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];

NSString *dateString = [formatter stringFromDate:date];

这将为您提供一个字符串,其中包含给定时区中的正确日期,对于您投掷的任何NSDate。请勿尝试转换NSDate

根据评论

额外

2016年美国的夏令时从3月13日02:00开始。此时,时间将向前移动一小时。如果您使用开始日期字符串@"03/12/2016 17:00:00"运行上述代码(在时间更改之前),则最终结果为Mar 12, 2016, 9:00:00 AM。如果您使用开始日期字符串@"03/13/2016 17:00:00"(时间更改后)运行它,则结果为Mar 13, 2016, 10:00:00 AM

因此,代码通过在夏令时开始之前和之后返回不同的时间并在夏令时期间正确返回一天中的某个时间来正确调整夏令时。你似乎得到了相同的结果,所以我不再确定你要解决的问题。

答案 1 :(得分:0)

不是使用US/Pacific尝试将其替换为America/Los_Angeles,而是会自动检测 DST 并将时区更改为 -7 。< / p>

我处理一些从服务器获取UTC时间的应用程序,我们从来没有遇到过使用它的问题。

答案 2 :(得分:0)

斯威夫特4: 鉴于日期格式“2018-03-13 07:00:00 +0000”,返回值应为“”2018-03-12“

import { Component, AfterViewInit, Input, 
    ElementRef, ViewChild, ChangeDetectorRef } from '@angular/core';

declare var Prism: any;

@Component({
  selector: 'prism',
  template: `
  <div hidden="true" #rawContent>
    <ng-content></ng-content>
  </div>
  <section class="code-container">
    <pre><code [innerHtml]="content" class="block language-{{language}}"></code></pre>
  </section>
  `
})
export class PrismComponent implements AfterViewInit {
  @Input() language: string;
  @ViewChild('rawContent') rawContent: ElementRef;
  content: string;

  constructor(public cdr: ChangeDetectorRef) {}

  ngAfterViewInit() {
    this.content = Prism.highlight(this.rawContent.nativeElement.textContent.trim(),
        Prism.languages[this.language]);
    this.cdr.detectChanges();
  }
}