You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:17:51