2004-02-12T15:19:21+00:00
在PHP中获取ISO 8601日期字符串(例如)很容易date('c')
,但是如何在Objective-C(iPhone)中获取它?是否有类似的简短方法呢?
这是我发现的漫长道路:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Run Code Online (Sandbox Code Playgroud)
对于如此重要的事情来说,这似乎是一件非常艰难的事情.
为什么python 2.7在UTC日期时间对象的isoformat字符串末尾不包含Z字符(Zulu或零偏移量)?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
Run Code Online (Sandbox Code Playgroud)
而在javascript中
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
Run Code Online (Sandbox Code Playgroud) 我需要使用Excel/VBA中包含的时区(从外部源)解析ISO8601日期/时间格式到正常的Excel日期.据我所知,Excel XP(我们正在使用的)没有内置的例程,所以我想我正在寻找一个用于解析的自定义VBA函数.
ISO8601的日期时间看起来像下列之一:
2011-01-01
2011-01-01T12:00:00Z
2011-01-01T12:00:00+05:00
2011-01-01T12:00:00-05:00
2011-01-01T12:00:00.05381+05:00
Run Code Online (Sandbox Code Playgroud) 因此在Python 3中,您可以使用.isoformat()生成ISO 8601日期,但是您无法将isoformat()创建的字符串转换回datetime对象,因为Python自己的日期时间指令不能正确匹配.也就是说,%z = 0500而不是05:00(由.isoformat()生成).
例如:
>>> strDate = d.isoformat()
>>> strDate
'2015-02-04T20:55:08.914461+00:00'
>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Python34\Lib\_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
Run Code Online (Sandbox Code Playgroud)
来自Python的strptime文档:(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)
%z UTC格式+ HHMM或-HHMM中的UTC偏移量(如果对象是天真的,则为空字符串).(空),+ 0000,-0400,+ 1030
因此,简而言之,Python甚至不遵守自己的字符串格式化指令.
我知道日期时间在Python中已经很糟糕了,但这真的超出了不合理的范围,变成了愚蠢的土地.
告诉我这不是真的.
我有以下格式的日期: 2010-03-01T00:00:00-08:00
我在它上面抛出了以下SimpleDateFormats来解析它:
private static final SimpleDateFormat[] FORMATS = {
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"), //ISO8601 long RFC822 zone
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"), //ISO8601 long long form zone
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"), //ignore timezone
new SimpleDateFormat("yyyyMMddHHmmssZ"), //ISO8601 short
new SimpleDateFormat("yyyyMMddHHmm"),
new SimpleDateFormat("yyyyMMdd"), //birthdate from NIST IHE C32 sample
new SimpleDateFormat("yyyyMM"),
new SimpleDateFormat("yyyy") //just the year
};
Run Code Online (Sandbox Code Playgroud)
我有一个方便的方法,使用这样的格式:
public static Date figureOutTheDamnDate(String wtf) {
if (wtf == null) {
return null;
}
Date retval = null;
for (SimpleDateFormat sdf : FORMATS) {
try {
sdf.setLenient(false)
retval = sdf.parse(wtf); …
Run Code Online (Sandbox Code Playgroud) 需要有关将具有以下结构的ISO 8601日期转换为javascript的帮助/提示.
CCYY-MM-DDThh:mm:ssTZD
Run Code Online (Sandbox Code Playgroud)
我想照这样的日期:
January 28, 2011 - 7:30PM EST
Run Code Online (Sandbox Code Playgroud)
我想让这个解决方案尽可能干净简洁.
我正在尝试在Python中生成RFC 3339 UTC时间戳.到目前为止,我已经能够做到以下几点:
>>> d = datetime.datetime.now()
>>> print d.isoformat('T')
2011-12-18T20:46:00.392227
Run Code Online (Sandbox Code Playgroud)
我的问题是设置UTC偏移量.
根据该文件,在类方法datetime.now([tz])
,有一个可选的tz
参数,其中tz must be an instance of a class tzinfo subclass
,和datetime.tzinfo
是an abstract base class for time zone information objects.
这就是我迷路的地方 - 为什么tzinfo是一个抽象类,我该如何实现呢?
(注意:在PHP中它很简单timestamp = date(DATE_RFC3339);
,这就是为什么我无法理解为什么Python的方法如此错综复杂......)
在Python中,我如何转换这样的字符串:
星期四,2010年12月16日12:14:05 +0000
符合ISO 8601格式,同时保留时区?
请注意,原始日期是字符串,输出也应该是字符串,不是datetime
或类似的.
不过,我使用第三方库没有问题.
如果我使用以下代码:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);
Run Code Online (Sandbox Code Playgroud)
它成功地转换为一个Date
对象,但是,我似乎无法以任何其他方式格式化它yyyy-MM-dd'T'HH:mm
,即记录的是什么2010-01-28T15:22:23
如果我更改dateFormat以说[dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"];
Date对象为null ...
所以我的最终问题是如何格式化SQL数据库中的ISO8601时间戳,以便使用,例如,NSDateFormatterMediumStyle
返回"2010年1月1日"?
iso8601 ×10
datetime ×7
python ×4
nsdate ×2
rfc3339 ×2
.net ×1
c# ×1
date ×1
excel ×1
formatting ×1
ios ×1
java ×1
javascript ×1
objective-c ×1
python-2.7 ×1
timestamp ×1
timezone ×1
vba ×1