2012-03-08 9 views
1

EDIT:基本的に、私は理想的なISO-8601を経由して、UTC時間で、これを実行するために探しています:Python datetime.datetime.utctime()をObj-C NSDateに変換して元に戻すにはどうすればいいですか?

  1. のPython:datetime.datetimeのは---> ISO-8601文字列
  2. パイソン:ISO -8601文字列---> datetime.datetimeの
  3. のObj-C:NSDate ---> ISO-8601 NSStringの
  4. のObj-C:ISO-8601 NSStringの---> NSDate

これは本当にシンプルなはずですが、わかりません。文字列に変換

Pythonコード:タイムゾーン情報%zは(utcnowので、空の文字列として印刷されていることを

>>> import datetime 
>>> datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S %z") 
'2012-03-08 00:07:31 ' 

注)ナイーブ DateTimeオブジェクトを返します。どのようにを認識し、次のように印刷するには?物事のOBJの-C側で

'2012-03-08 00:07:31 +0000' 

// This fails and prints (null) since the timezone is missing. 
NSString *pythonDate1 = @"2012-03-07 23:51:58 "; 
NSDate *objCDate1 = [NSDate dateWithString:pythonDate1]; 
NSLog(@"%@", objCDate1); 

// This works, manually adding in the "+0000". 
NSString *pythonDate2 = @"2012-03-07 23:51:58 +0000"; 
NSDate *objCDate2 = [NSDate dateWithString:pythonDate2]; 
NSLog(@"%@", objCDate2); 

プリントアウト:私はdatetime.datetimeのにNSDateから戻ってどのように非常にわからない

2012-03-07 19:14:47.848 Untitled 3[3912:707] (null) 
2012-03-07 19:14:47.849 Untitled 3[3912:707] 2012-03-07 23:51:58 +0000 

オブジェクトも。どんな助けでも大歓迎です! :)

答えて

1

を、そして、あなたの時間はUTCであり、ちょうど最後までズールー/ゼロを定義する「Z」を追加していない理由をISO-8601

>>> datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") 
'2012-03-08T00:07:31Z' 
で定義されています10

Obj-CはISO-8601の書式設定をサポートしていない限り...

それとも、あなたはまだのみ)(utcnow使用しようとしている場合、あなたはカンニングとちょうど00を追加することができます:00:

>>> datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S +00:00") 
'2012-03-08 00:07:31 +00:00' 
+0

それは厳密にそれをサポートしていますが、部分的にしかいないように見えます。それは 'Z'を好きではありませんが、代わりに' + 0000'と '+00:00'を受け入れます。 –

+1

もう一度、Obj-C utc時間を過ごすだけなら、あなたは不正行為をして+00:00を提供することができます。それ以外の場合は、あなたがPhilのようにピッツを使用しなければならないと思います。 – monkut

2

datetime.utcnow()の代わりにdatetime.now(tz)を使用すると、意識したdatetimeオブジェクトが得られます。

2

あなたが本当に現地時間が必要な場合:

import datetime 
from pytz import timezone 

ET = timezone('US/Eastern') 

now = datetime.datetime.now(ET) 
now.strftime("%Y-%m-%d %H:%M:%S %z") 

あなたはその後、UTCを使用して、DBか何か持っている場合:あなたはタイムゾーンオブジェクトに対処する必要はありません場合は

now = datetime.datetime.utcnow() 
ET.localize(now).strftime("%Y-%m-%d %H:%M:%S %z") 
2

Pythonの日時をISO-8601文字列に:

>>> from datetime import datetime 
>>> now = datetime.utcnow() 
>>> string = now.strftime("%Y-%m-%dT%H:%M:%S +0000")    # Manually specifying ' +0000' since we know we have UTC time. 
>>> 
>>> string 
'2012-03-08T21:19:26 +0000' 
Pythonのdatetime型に

ISO-8601文字列:

>>> from datetime import datetime 
>>> string = "2012-03-08T21:19:26 +0000" 
>>> time = datetime.strptime(string, "%Y-%m-%dT%H:%M:%S +0000") # Only works for UTC time. 
>>> 
>>> time 
datetime.datetime(2012, 3, 8, 21, 18, 31) 

ISO-8601のNSStringにNSDate:

NSDate   *now   = [NSDate date]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
NSLocale  *locale   = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
NSTimeZone  *timeZone  = [NSTimeZone timeZoneWithName:@"UTC"]; 
[dateFormatter setLocale:locale];         // Using "en_US" for locale ?eliminates/reduces? issues with systems running different locales. 
[dateFormatter setTimeZone:timeZone]; 
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; // Explicitly re-stating default behavior for 10.4+. 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss Z"]; 
NSString  *iso8601String = [dateFormatter stringFromDate:now]; 

NSLog(@"%@", iso8601String); 
2012-03-09T02:44:37 +0000 

ISO-8601はNSDateにNSStringの:

NSString  *iso8601String = @"2012-03-09T20:37:49 +0000"; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
NSLocale  *locale   = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
[dateFormatter setLocale:locale];         // Using "en_US" for locale ?eliminates/reduces? issues with systems running different locales. 
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; // Explicitly re-stating default behavior for 10.4+. 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss Z"]; 
NSDate *date = [dateFormatter dateFromString:iso8601String]; 

NSLog(@"%@", date); 
2012-03-09 20:37:49 +0000 
関連する問題