获取30天前日期并转为ISO8601格式适配Amazon MWS遇问题
解决Amazon MWS的ISO8601日期格式问题
我帮你排查下这个问题——Amazon MWS对ISO8601格式的要求其实挺严格的,你的代码虽然能运行输出日期,但在格式细节和时区处理上没达标,这才导致了报错。
先分析你现有代码的问题
你的代码逻辑是:
$tester = date("c"); $tester = date('Y-m-d H:i:s', strtotime($tester . ' -30 days')); $datetime = urlencode($tester); echo $datetime;
这里有两个核心问题:
- 冗余的时间转换:你先获取带时区的ISO格式字符串,再转成不带时区的
Y-m-d H:i:s格式,再用strtotime解析,这一步不仅多余,还可能丢失时区信息,导致服务器默认时区和MWS要求的UTC时区不匹配。 - 格式不符合MWS要求:MWS需要的ISO8601格式是UTC时区的,格式为
YYYY-MM-DDTHH:mm:ssZ(比如2024-05-20T12:34:56Z),而你的代码输出的是YYYY-MM-DD HH:mm:ss格式,缺少了日期时间分隔符T和UTC标识Z,这是亚马逊报错的关键原因。
正确的解决方案
推荐用PHP的DateTime类来处理,它更可靠,能精准控制时区和格式:
// 创建UTC时区的当前时间对象 $date = new DateTime('now', new DateTimeZone('UTC')); // 减去30天 $date->sub(new DateInterval('P30D')); // 格式化为MWS要求的ISO8601格式 $isoDate = $date->format('Y-m-d\TH:i:s\Z'); // 进行URL编码 $datetime = urlencode($isoDate); echo $datetime;
如果你更习惯用strtotime和date,也可以这样写(记得先设置UTC时区):
// 强制使用UTC时区,避免服务器时区差异 date_default_timezone_set('UTC'); // 直接生成30天前的UTC时间,并格式化为MWS需要的格式 $isoDate = date('Y-m-d\TH:i:s\Z', strtotime('-30 days')); $datetime = urlencode($isoDate); echo $datetime;
这两种写法都会输出符合MWS要求的格式,比如2024-05-20T12:34:56Z,URL编码后就是2024-05-20T12%3A34%3A56Z,亚马逊就能正确识别了。
内容的提问来源于stack exchange,提问作者Thomas Gregory
相关产品推荐
相关产品推荐

