39

やっています:

NSDate *currentDateInLocal = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:SS.SSS'Z'"];
NSString *currentLocalDateAsStr = [dateFormatter stringFromDate:currentDateInLocal];

NSDateFormatter * dateFormatter2 = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter2 setTimeZone:timeZone];
[dateFormatter2 setDateFormat:@"yyyy-MM-dd'T'HH:mm:SS.SSS'Z'"];
NSDate *currentDateInUTC = [dateFormatter2 dateFromString:currentLocalDateAsStr];

しかし、それでも現在のUTC時刻を表すものではありません。どうすればこれを達成できますか?

ありがとう

4

8 に答える 8

53

あなたは物事を複雑にしすぎています。

NSDate■タイムゾーンやカレンダーはありません。[NSDate date]履歴の瞬間の測定値である現在の日付を取得します。[NSDate date]アメリカで実行するのとまったく同時にヨーロッパで実行すると、まったく同じ値が得られます。

日付の印刷方法は、カレンダーとタイムゾーンによって異なります。したがって、グレゴリオ暦で印刷された日付は、ユリウス暦で印刷された同じ日付とは異なって見えます。また、UTCグレゴリオ暦で印刷された日付は、PSTグレゴリオ暦で印刷された同じ日付とは異なって見えます。しかし、彼らはまだ同じ日付です。

だからあなたはあなたのにまっすぐにジャンプしたいですdateFormatter2

于 2013-01-29T21:41:27.610 に答える
43

AlexWienが受け入れた回答は正しくありません。

デフォルトでは、NSDateFormatterはNSDateの日時値をUTCからユーザーのローカルタイムゾーンに調整します。この調整を防ぐには、NSDateFormatterにのタイムゾーンを使用するように指示しますUTC

結果を確認するには、「currenttimeutc」をグーグルで検索してください。

以下の私のソースコードはその仕事をするはずです。つまり、現在の日時を、末尾にaで示されるUTCZulu)タイムゾーンのISO8601形式の文字列として取得します。Z

NSDate* datetime = [NSDate date];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // Prevent adjustment to user's local time zone.
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];

このロジックは、アプリのどこかにある便利なメソッドのペアに入れることができます。

- (NSString*)now
{
    // Purpose: Return a string of the current date-time in UTC (Zulu) time zone in ISO 8601 format.
    return [self toStringFromDateTime:[NSDate date]];
}

…そして…</p>

- (NSString*)toStringFromDateTime:(NSDate*)datetime
{
    // Purpose: Return a string of the specified date-time in UTC (Zulu) time zone in ISO 8601 format.
    // Example: 2013-10-25T06:59:43.431Z
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
    return dateTimeInIsoFormatForZuluTimeZone;
}

使用例…</p>

NSString* now = [self now];

または、これらのマイナス記号をプラス記号に変換して、インスタンスメソッドではなくクラスメソッドとして使用します…</ p>

NSString* now = [SomeClassNameHere now];

ヒント:人間が読みやすくするためTに、形式をスペースに変更してください。ソフトウェアによる相互運用性を高めるために、を保持しTます。ISO 8601仕様はスペースを許容しますが、を維持することをお勧めしTます。


ヒント:テストはしていませんが…インスタンス化には費用がかかると言う人もいます[NSDateFormatter][4]。頻繁に行う場合(ループ内など)は、再利用のために単一のインスタンスをキャッシュすることを検討してください。

于 2013-10-25T06:50:17.110 に答える
42
NSDate *currentDate = [[NSDate alloc] init];

現在はUTCになっています(少なくとも以下の方法を使用した後)
この時刻をUTCとして保存するには(参照日1970以降)を使用します

double secsUtc1970 = [[NSDate date]timeIntervalSince1970];

現地時間を出力するように日付フォーマッタを設定します。

NSTimeZone *timeZone = [NSTimeZone defaultTimeZone];
// or Timezone with specific name like
// [NSTimeZone timeZoneWithName:@"Europe/Riga"] (see link below)
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString *localDateString = [dateFormatter stringFromDate:currentDate];

利用可能なNSTimeZone名

オブジェクトは常にUTCを時間参照として使用しNSDateますが、日付の文字列表現は必ずしもUTCタイムゾーンに基づいているわけではありません。

UTCは(唯一の)timeZoneではないことに注意してください。これは、地球上の時間を測定する方法、調整する方法のシステムです(UTCのCは調整を表します)。
NSDateは、1.1.1970 UTCの午前0時の参照日付に関連付けられていますが、Appleによって1.1.1970GMTとわずかに誤って記述されています。

元の質問では、最後の単語timeZoneは完全ではありません。

于 2013-01-29T21:32:19.923 に答える
11

カレンダー識別子を設定してください!!!

手遅れではありません!誰もカレンダー識別子を設定していないのを見たからです。これは、世界中のユーザーにとって非常に重要です。グレゴリオ暦以外のカレンダーを使用している多くのユーザー。彼らは間違った年の文字列を取得します。特に、独自のデータベースに保存する必要がある場合。(以前にこの問題に遭遇しました)

NSCalendarIdentifierGregorian
NSCalendarIdentifierBuddhist
NSCalendarIdentifierChinese
NSCalendarIdentifierHebrew
NSCalendarIdentifierIslamic
NSCalendarIdentifierIslamicCivil
NSCalendarIdentifierJapanese
NSCalendarIdentifierRepublicOfChina
NSCalendarIdentifierPersian
NSCalendar
_

コード:

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter setCalendar:gregorianCalendar];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setLocale:locale];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    return dateString;
}  
于 2015-11-10T01:29:09.027 に答える
3

スウィフト3

let utcTimestamp = Date().timeIntervalSince1970
print("timeStamp = \(utcTimestamp)")

次の拡張がより簡単になるかもしれません。

Swift 4:UTC /GMT⟺ローカル(現在/システム)

extension Date {

    // Convert local time to UTC (or GMT)
    func toGlobalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = -TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

    // Convert UTC (or GMT) to local time
    func toLocalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

}


// Try it
let utcDate = Date().toGlobalTime()
let localDate = utcDate.toLocalTime()

print("utcDate - (utcDate)")
print("localDate - (localDate)")
于 2017-06-02T09:55:21.480 に答える
2

[NSDate日付]はUTCです。たぶんあなたは地元の人を見てだまされますか?次に、タイムゾーンに変換されます。

ローカルで値を表示する場合は現地時間で表示されますが、コンソールで出力する場合はUTCで表示されます。

時間の後に「+0000」が表示されている場合は、UTCであることがわかります。

于 2013-01-29T21:40:39.303 に答える
0

それを行うさらに別の方法は、ObjectiveCプロジェクトのC++クラスでそうするようなものです。(したがって、.mmファイルを作成し、パブリック部分とプライベート部分を使用してC ++クラスを作成し、これをパブリック部分に貼り付けます(プライベートが必要な場合を除く)。次に、のように参照しNSString *sNowUTC = MyClass::getUTCTimestamp();ます。

static NSString *getUTCTimestamp(){
  time_t rawtime;
  struct tm * timeinfo;
  char buffer [80];
  time (&rawtime);
  timeinfo = gmtime (&rawtime);
  // make format like "2016-06-16 02:37:00" for 
  //   June 16, 2016 @ 02:37:00 UTC time
  strftime (buffer,80,"%F %T",timeinfo);
  std::string sTime(buffer);
  NSString *sUTC = @(sTime.c_str());
  return sUTC;
}
于 2016-06-17T02:41:38.407 に答える
0

これは私が使用したものです。

static func makeISO8601Date(isoDateString: String) -> Date {
    let formatter = DateFormatter()
    formatter.calendar = Calendar(identifier: .iso8601)
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

    return formatter.date(from: isoDateString)
}

makeISO8601Date(isoDateString: "2017-12-31T23:59:59+00:00")

于 2017-01-26T18:42:12.370 に答える