Jika itu membantu, pikirkan suhu. Mereka dapat diekspresikan dalam Fahrenheit, Celsius, atau Kelvin. Tetapi informasi yang diungkapkan (pergerakan rata-rata molekul) tidak memiliki unit intrinsik, meskipun hanya bermakna bagi kita ketika diekspresikan dalam beberapa unit.
perangkat lunak berkembang
7
@DaveDeLong NSDate memang memiliki zona waktu. Dari referensi kelas NSDate: "Metode ini mengembalikan nilai waktu relatif ke tanggal referensi absolut — instan pertama 1 Januari 2001, GMT." Perhatikan referensi yang jelas dan spesifik untuk GMT.
Murray Sagal
3
Saya tidak setuju. NSDate TIDAK memiliki zona waktu. Untuk menentukan zona waktu untuk NSDate, Anda menggunakan objek NSCalendar atau objek NSDateFormatter. Jika Anda membuat NSDate dari string yang tidak memiliki zona waktu yang ditentukan, maka NSDate akan menganggap bahwa string tersebut dalam waktu GMT.
Rickster
1
@MurraySagal Hanya karena satu metode tertentu mengembalikan nilai waktu relatif terhadap tanggal dalam zona waktu tertentu, itu tidak berarti bahwa NSDate memodelkan tanggal sebagai relatif terhadap zona waktu.
eremzeit
Jawaban:
139
NSTimeInterval seconds;// assume this existsNSDate* ts_utc =[NSDate dateWithTimeIntervalSince1970:seconds];NSDateFormatter* df_utc =[[[NSDateFormatter alloc] init] autorelease];[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSDateFormatter* df_local =[[[NSDateFormatter alloc] init] autorelease];[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSString* ts_utc_string =[df_utc stringFromDate:ts_utc];NSString* ts_local_string =[df_local stringFromDate:ts_utc];// you can also use NSDateFormatter dateFromString to go the opposite way
mungkin layak disebutkan Anda dapat menggunakan formatter untuk membaca tanggal kembali dari string juga
slf
34
@DaveDeLong itu semua baik dan bagus jika Anda hanya menampilkan tanggal sebagai string. Tetapi ada alasan yang sah untuk melakukan konversi zona waktu pada suatu tanggal. Misalnya, jika Anda ingin menetapkan tanggal pada UIDatePicker menggunakan setDate :. Tanggal yang dikembalikan oleh layanan web sering kali adalah UTC, tetapi mewakili suatu peristiwa di zona waktu lokal pengguna, seperti daftar TV. Melewati tanggal yang belum dikonversi akan menampilkan waktu yang salah di pemilih.
Christopher Pickslay
5
@ GlennMaynard saya tidak setuju. Inti dari jawaban ini adalah bahwa tidak perlu ada konversi ke NSDateobjek, yang benar. Konversi ke zona waktu terjadi ketika tanggal diformat, bukan ketika itu dibuat, karena tanggal tidak memiliki zona waktu.
Dave DeLong
1
@ GlennMaynard ... kecuali yang NSCalendarDatesudah usang.
EDIT Ketika saya menulis ini, saya tidak tahu saya harus menggunakan dateformatter yang mungkin merupakan pendekatan yang lebih baik, jadi lihatlahslf juga jawabannya.
Saya memiliki layanan web yang mengembalikan tanggal dalam UTC. Saya gunakan toLocalTimeuntuk mengubahnya ke waktu lokal dantoGlobalTime untuk mengkonversi kembali jika diperlukan.
Jangan lakukan ini. NSDates selalu dalam UTC. Ini hanya membingungkan masalah.
JeremyP
13
Ini bisa sangat berguna untuk kasus "layanan web" yang disebutkan di atas. Katakanlah Anda memiliki server yang menyimpan acara di UTC dan klien ingin meminta semua acara yang terjadi hari ini. Untuk melakukan ini, klien perlu mendapatkan tanggal saat ini (UTC / GMT) dan kemudian menggesernya dengan offset zona waktu sebelum mengirimnya ke server.
Taylor Lafrinere
@ JeremyP Akan lebih akurat untuk mengatakan bahwa NSDates selalu dalam GMT. Dari referensi kelas NSDate: "Metode ini mengembalikan nilai waktu relatif ke tanggal referensi absolut — instan pertama 1 Januari 2001, GMT." Perhatikan referensi yang jelas dan spesifik untuk GMT. Ada perbedaan teknis antara GMT dan UTC tetapi itu sebagian besar tidak relevan dengan solusi yang kebanyakan orang cari.
Jawaban ini terasa lebih portabel. Jawaban di bawah ini mengasumsikan zona waktu tetap pada saat runtime sedangkan jawaban di atas berasal zona waktu dari platform.
bleeckerj
9
Sangat membantu. Satu tambahan, secondsFromGMTForDateharus digunakan jika Anda ingin memperhitungkan penghematan siang hari. Lihat Apple Docs
Sergey Markelov
1
Ini gagal memperhitungkan perubahan DST akun.
lkraider
36
Swift 3+ : UTC ke Lokal dan Lokal ke UTC
extension Date{// Convert UTC (or GMT) to local time
func toLocalTime()->Date{let timezone =TimeZone.current
let seconds =TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}// Convert local time to UTC (or GMT)
func toGlobalTime()->Date{let timezone =TimeZone.current
let seconds =-TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}}
Jawaban bagus! Ini akan mengambil tanggal saat ini. Adaptasi ini yang menggunakan string tanggal akan diganti [NSDate date]dengan [NSDate dateWithNaturalLanguageString:sMyDateString].
//This is basic way to get time of any GMT time.NSDateFormatter*formatter =[[NSDateFormatter alloc] init];[formatter setDateFormat:@"hh:mm a"];// 09:30 AM[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]];// For GMT+1NSString*time =[formatter stringFromDate:[NSDate date]];// Current time
Karena tidak ada yang tampaknya menggunakan NSDateComponents, saya pikir saya akan memasukkan satu ... Dalam versi ini, tidak ada NSDateFormatteryang digunakan, maka tidak ada string parsing, dan NSDatetidak digunakan untuk mewakili waktu di luar GMT (UTC). Dokumen asli NSDateada dalam variabel i_date.
NSCalendar*anotherCalendar =[[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar];
anotherCalendar.timeZone =[NSTimeZone timeZoneWithName:i_anotherTimeZone];NSDateComponents*anotherComponents =[anotherCalendar components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitNanosecond) fromDate:i_date];// The following is just for checking
anotherComponents.calendar = anotherCalendar;// anotherComponents.date is nil without thisNSDate*anotherDate = anotherComponents.date;
i_anotherCalendarbisa jadi NSCalendarIdentifierGregorianatau kalender lainnya. Yang NSStringdiizinkan untuk i_anotherTimeZonedapat diperoleh dengan [NSTimeZone knownTimeZoneNames], tetapi anotherCalendar.timeZonebisa [NSTimeZone defaultTimeZone]atau [NSTimeZone localTimeZone]atau [NSTimeZone systemTimeZone]sama sekali.
Ini sebenarnya anotherComponentsmenahan waktu di zona waktu baru. Anda akan melihat anotherDatesama dengan i_date, karena waktu berlaku dalam GMT (UTC).
Jawaban:
Tabel parameter string pemformatan:
https://waracle.com/iphone-nsdateformatter-date-formatting-table/
Jika kinerja adalah prioritas, Anda mungkin ingin mempertimbangkan untuk menggunakan
strftime
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.htmlsumber
NSDate
objek, yang benar. Konversi ke zona waktu terjadi ketika tanggal diformat, bukan ketika itu dibuat, karena tanggal tidak memiliki zona waktu.NSCalendarDate
sudah usang.EDIT Ketika saya menulis ini, saya tidak tahu saya harus menggunakan dateformatter yang mungkin merupakan pendekatan yang lebih baik, jadi lihatlah
slf
juga jawabannya.Saya memiliki layanan web yang mengembalikan tanggal dalam UTC. Saya gunakan
toLocalTime
untuk mengubahnya ke waktu lokal dantoGlobalTime
untuk mengkonversi kembali jika diperlukan.Di sinilah saya mendapat jawaban dari:
https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/
sumber
Metode termudah yang saya temukan adalah ini:
sumber
secondsFromGMTForDate
harus digunakan jika Anda ingin memperhitungkan penghematan siang hari. Lihat Apple DocsSwift 3+ : UTC ke Lokal dan Lokal ke UTC
sumber
Jika Anda ingin tanggal dan waktu setempat. Coba kode ini: -
sumber
[NSDate date]
dengan[NSDate dateWithNaturalLanguageString:sMyDateString]
.Ubah tanggal UTC Anda menjadi Tanggal Lokal
Gunakan Seperti Ini
sumber
Di sini input adalah string currentUTCTime (dalam format 08/30/2012 11:11) mengonversi waktu input dalam GMT ke sistem mengatur waktu zona
sumber
sumber
Ubah tanggal dari kalender UTC menjadi kalender dengan NSTimeZone lokal yang sesuai .
sumber
Saya menulis Metode ini untuk mengonversi waktu tanggal ke LocalTimeZone kami
-Sini (NSString *) Parameter TimeZone adalah zona waktu server
sumber
Karena tidak ada yang tampaknya menggunakan
NSDateComponents
, saya pikir saya akan memasukkan satu ... Dalam versi ini, tidak adaNSDateFormatter
yang digunakan, maka tidak ada string parsing, danNSDate
tidak digunakan untuk mewakili waktu di luar GMT (UTC). Dokumen asliNSDate
ada dalam variabeli_date
.i_anotherCalendar
bisa jadiNSCalendarIdentifierGregorian
atau kalender lainnya. YangNSString
diizinkan untuki_anotherTimeZone
dapat diperoleh dengan[NSTimeZone knownTimeZoneNames]
, tetapianotherCalendar.timeZone
bisa[NSTimeZone defaultTimeZone]
atau[NSTimeZone localTimeZone]
atau[NSTimeZone systemTimeZone]
sama sekali.Ini sebenarnya
anotherComponents
menahan waktu di zona waktu baru. Anda akan melihatanotherDate
sama dengani_date
, karena waktu berlaku dalam GMT (UTC).sumber
Anda dapat mencoba yang ini:
sumber
Konversi waktu UTC ke zona waktu saat ini.
fungsi panggilan
Fungsi
sumber