metaWeblog API的时间格式与时区

所有metaWeblog API的文档都提到,API中发送的时间格式是ISO8601,它是由数字格式的年、月、日、小时、分钟、秒所组成的,以下是一个例子:

20070418T07:05:23

它表示2007年4月18日早上7点5分23秒

这个格式有一个问题是没有提供时区的信息,而且api中并没有规定缺省情况下应该用什么时区,这样不同的实现就可能对时间存在歧义。
通常大部分服务器会假定时间是UTC,但是这一点并不能得到保证,有时候有些服务器会使用服务器的默认时区。
由于这种歧义的的存在,如果你想做一个通用的工具,就会造成一些困难,因为你可能不知道发送出去的时间是否会被服务器正确理解。

但是服务器会遵守下面两点规则:

  1. API规定如果发送的时候不提供时间,那么服务器就会使用系统的当前时间。
  2. 服务器会使用同样的时区设定处理接受和发送出去的时间。

所以,如果我们发送一条不包含时间的post给服务器,服务器就会使用系统当前时间作为新的post的发布时间。
而当我们向服务器索取post的时候,服务器会自动使用默认的时区资料转换时间并发送回来。

这样一来,如果我们使用发送newPost指令时的时间同取回来的发布时间作比较,就可以找到服务器所使用的真正时区了。
具体的步骤是这样:

  1. 调用blogger.newPost方法向服务器发送一条不包含时间的新建post的指令,同时记录当前时间。
  2. newPost指令成功后,记录服务器返回的postid
  3. 使用刚才的postid调用metaWeblog.getPost方法,获取刚才建立的post,读出他的建立时间
  4. 用post的建立时间同发送newPost指令时的系统时间作比较,找出时间差,对时间差转换成小时为单位并取整。就是服务器的真正时差信息了。