Как преобразовать Python datetime.datetime.utctime () в Obj-C NSDate и обратно?

1

EDIT: В принципе, я хочу сделать это, в UTC-время, в идеале через ISO-8601:

  1. Python: datetime.datetime ---> строка ISO-8601
  2. Python: строка ISO-8601 ---> datetime.datetime
  3. Obj-C: NSDate ---> ISO-8601 NSString
  4. Obj-C: ISO-8601 NSString ---> NSDate

Это похоже на то, что это должно быть очень просто, но я не могу понять это.

Код Python, преобразование в строку:

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

Обратите внимание, что информация о временной зоне %z печатается как пустая строка, так как utcnow() возвращает наивный объект datetime. Как мне превратить его в осведомленный и заставить его печатать, как показано ниже?

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

На стороне Obj-C вещей:

// 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);

Распечатать:

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

Я не совсем уверен, как вернуться из NSDate к объекту datetime.datetime. Любая помощь очень ценится! :)

Теги:
datetime
utc
nsdate

4 ответа

1
Лучший ответ

если вы не хотите иметь дело с объектами часового пояса, и ваше время в UTC, почему бы просто не добавить "Z", определяющий Zulu/Zero до конца, как определено в ISO-8601

>>> datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
'2012-03-08T00:07:31Z'

Если, конечно, 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, вы можете обмануть и просто поставить +00: 00. В противном случае, я думаю, вам придется использовать pytz, как упоминает Фил.
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'

ISO-8601 String для даты и времени Python:

>>> 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)

NSDate к ISO-8601 NSString:

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 NSString для NSDate:

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
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")

если у вас есть db или что-то, что использует utc, тогда:

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

Использование datetime.now(tz) вместо datetime.utcnow() даст вам известный объект datetime.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню