为什么修补/保存时日期/时间值解释不正确?

2023-11-25

我尝试保存 cakephp 3 表单中的数据。所有数据都保存得很好,但日期时间却没有。我有 2 个日期时间字段。这些字段由 jquery-ui 小部件填充。

问题似乎发生在打包实体时。

$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
  • 调试 $this->request->data :

    'user_id' => '1',
    'description' => 'test',
    'starttime' => '2015/11/15 10:00',
    'endtime' => '2015/11/15 12:10'
    
  • 在 pacthEntity 之后调试我的对象 $intervention :

对象(应用程序\模型\实体\干预)

'id' => (int) 3,
'user_id' => (int) 1,
'description' => 'test',
'starttime' => null,
'endtime' => null
...

开始时间和结束时间变为空,我不明白为什么。

有人以前有过这个pb吗?

我尝试(为了调试和理解)在修补后强制字段值 mysql 中的日期时间字段是可以的。

$intervention->starttime = date('Y-m-d H:i:s', strtotime($this->request->data['starttime'])); 
$intervention->endtime = date('Y-m-d H:i:s', strtotime($this->request->data['endtime']));

感谢帮助


日期/时间值正在以区域设置感知的方式进行转换/解析


更新:这是 3.2.5 之前的 CakePHP 应用程序模板版本的默认行为。从 3.2.5 开始,默认情况下不再启用语言环境解析,这将使日期/时间编组逻辑期望默认格式为Y-m-d H:i:s反而。


在编组过程中,值根据相应的列类型进行“转换”。为了DATETIME列,这是由\Cake\Database\Type\DateTimeType类型类。

准确地说,这是在\Cake\Database\Type\DateTimeType::marshall().

使用默认的应用程序模板配置,DateTimeType配置为使用区域设置感知解析,并且由于没有设置默认区域设置格式,\Cake\I18n\Time::parseDateTime()将根据其默认的“字符串格式”解析值(Time::$_toStringFormat),默认为区域设置感知[IntlDateFormatter::SHORT, IntlDateFormatter::SHORT].

因此,如果您的区域设置设置为en_US,那么该值将以预期格式进行解析M/d/yy, h:mm a,你的值不适合,因此你最终会得到null正在为实体属性设置。

让解析器使用正确的格式

tl;dr

如果 jQuery 小部件的格式没有在您的应用程序中的任何地方使用,您可以临时设置正确的区域设置格式,或者禁用区域设置解析,例如

// for time- or date-only comlumn types you'd use 'time' or 'date' instead of 'datetime'
$dateTimeType = Type::build('datetime')->setLocaleFormat('yyyy/MM/dd HH:mm');

// ...
$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
// ...

$dateTimeType->setLocaleFormat(null);

or

$dateTimeType = Type::build('datetime')->useLocaleParser(false);

// ...
$intervention = $this->Interventions->patchEntity($intervention, $this->request->data);
// ...

$dateTimeType->useLocaleParser(true);

需要注意的是,这会影响all日期/时间输入,不仅仅是您的starttime and endtime fields!

另一方面,如果 jQuery 小部件使用的格式是您希望在应用程序中始终使用的格式,那么更改默认格式也可以做到这一点,例如

use Cake\I18n\Time;
use Cake\I18n\FrozenTime;

// To affect date-only columns you'd configure `Date` and `FrozenDate`.
// For time-only columns, see the linked SO question below.
Time::setToStringFormat('yyyy/MM/dd HH:mm');
FrozenTime::setToStringFormat('yyyy/MM/dd HH:mm');

in your bootstrap.php。请注意,还有Time/FrozenTime::setJsonEncodeFormat() and Time/FrozenTime::$niceFormat您可能也想/需要修改它。

See also

  • Cookbook > 国际化和本地化 > 解析本地化日期时间数据
  • Cookbook > 时间 > 设置默认区域设置和格式字符串
  • CakePHP 3时间列获取添加日期

在编组之前转换输入

另一种选择是将数据转换为Time编组过程之前的实例。这将避免前面提到的解决方案可能出现影响所有输入的问题。

In your InterventionsTable类(也可以放入行为或外部侦听器中):

use Cake\Event\Event;
use Cake\I18n\Time;

...

public function beforeMarshal(Event $event, \ArrayObject $data, \ArrayObject $options)
{
    foreach (['starttime', 'endtime'] as $key) {
        if (isset($data[$key]) && is_string($data[$key])) {
            $data[$key] = Time::parseDateTime($data[$key], 'yyyy/MM/dd HH:mm');
        }
    }
}

See also

Cookbook > 数据库访问和 ORM > 保存数据 > 在构建实体之前修改请求数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么修补/保存时日期/时间值解释不正确? 的相关文章

随机推荐

  • 如何在 Android 中解压 7zip 存档?

    我有一个7zip包含数百个文件的存档 这些文件被分成不同的目录 目标是从 FTP 服务器下载它 然后将其解压到手机上 我的问题是7zipSDK包含的内容并不多 我正在寻找有关 7z 文件解压的示例 教程和片段 解压通过Intent只是次要选
  • npm 命令中 - 和 -- (单破折号和双破折号)之间的区别

    我想知道这个问题是否已经得到解决 我用过一些这样的命令 npm install g npm install d 然后我用了一些类似的 npm install XYZ save dev npm install only dev 之间的根本区别
  • 发现对集合 org.hibernate.HibernateException 的共享引用

    我收到此错误消息 错误 找到对集合的共享引用 Person latedPersons 当我尝试执行时addToRelatedPersons anotherPerson person addToRelatedPersons anotherPe
  • 我可以在没有 GUI 的情况下使用 OS X 10.8 的语音识别/听写功能吗?

    理想情况下 我想使用 Python 的 10 8 Mountain Lion 听写功能 而不需要 GUI 据我所知 目前仅支持听写UITextInput协议 这意味着 GUI 正确吗 您可以创建一个虚拟文本字段 并通过模拟按键以编程方式开始
  • 更改 Hadoop 中现有文件的块大小

    考虑一个 hadoop 集群 其中默认块大小为 64MBhdfs site xml 然而 后来团队决定将其更改为 128MB 这是我对上述场景的疑问 此更改是否需要重新启动集群 或者它会自动占用并且所有新文件将具有 128MB 的默认块大小
  • C/C++ 条件返回语句[重复]

    这个问题在这里已经有答案了 我正在研究嵌入式程序 在某些情况下 如果没有条件 我想尽快从函数返回 如果我有以下代码并且我正在进行嵌入式编程 foo if a lt b return 0 bail since condition is met
  • CoreData关系错误?

    我有一个与单位有 对多 关系的订单 当我尝试按顺序记录单位 NSSet 时 出现错误 NSFetchRequest fetchRequest NSFetchRequest alloc init NSEntityDescription ent
  • IBM Db2 中 if 存在的语法

    如果表存在但它似乎不适用于 IBM Db2 则以下查询将删除该表 Begin atomic if exists SELECT 1 FROM SYSIBM SYSTABLES WHERE NAME EMAIL AND TYPE T AND c
  • Socket.io 意外断开

    我有node js 服务和角度客户端 使用socket io 在长时间的http 请求期间传输一些消息 Service export const socketArray SocketIO Socket export let socketMa
  • Postgres 无法侦听特定 IP 地址

    我试图阻止对 PostgreSQL 的访问 只允许访问本地主机和我的机器外部 IP 例如 172 211 xx xx 此 IP 由我的 ISP 互联网服务提供商 提供 In postgresql conf我设置了以下行 listen add
  • GZIP解压 C# OutOfMemory

    我有许多从 ftp 下载的大型 gzip 文件 大约 10MB 200MB 需要解压 所以我尝试谷歌并找到一些gzip解压的解决方案 static byte Decompress byte gzip using GZipStream str
  • fluidd 不解析 JSON 日志文件条目

    我在 Stackoverflow 上看到过很多类似的问题 包括this one 但没有一个解决我的具体问题 该应用程序部署在 Kubernetes v1 15 集群中 我正在使用基于的 docker 映像流利 流利的 docker imag
  • Django:如何构建自定义表单小部件?

    我很难找到有关如何编写自定义小部件的文档 我的问题是 如果我构建一个自定义小部件 它是否可以等效地用于管理界面或普通表单 如果我想允许用户编辑项目列表 我应该子类化哪个小部件 我需要重写 实现小部件的哪些方法 什么小部件方法负责从用户输入返
  • 通过参数清除缓存

    我们希望在生产部署中缓存崩溃 但不想立即浪费大量时间来找出这样做的系统 我的想法是将参数应用于具有当前版本号的 css 和 js 文件的末尾 有两个问题 这会有效地破坏缓存吗 该参数是否会导致浏览器永远不会缓存来自该 url 的响应 因为该
  • “无法将多个参数绑定到请求的内容。”在 web api 和 angularJs 中

    当传入多个参数时WebApi结果是异常 Can t bind multiple parameter to the request s content 有以下代码的解决方案 public class A1 public int id get
  • 汇编中的递归斐波那契

    我正在尝试在汇编中实现递归斐波那契程序 但是 我的程序崩溃了 出现未处理的异常 而且我似乎无法找出问题所在 我不怀疑这涉及我对堆栈的不当使用 但我似乎无法指出哪里 386 model Flat public Fibonacci includ
  • 如何使用 Retrofit 在 JSON 请求中获取“nameValuePairs”?

    我如何发帖JSONObject要求如下 原始请求 pObj robj l index 1 user id 111 vername 1 fcmtoken ghkghkhkh uobject pname y6y68uuy7 在 Volley 中
  • 如果失败,如何重新发送 GWT RPC 请求(或如何创建持久 RPC 请求)?

    如果失败 HTTP 200 之外的任何响应代码 我需要重试发送 GWT RPC 请求 原因很复杂 我就不多说了 到目前为止 我将所有请求响应放在同一个地方 如下所示 We override the RpcRequestBuilder doS
  • 垂直 RecyclerView 内的水平 RecyclerView 滚动急动

    我使用的布局中使用多个 RecyclerView 水平 作为 RecyclerView 的项目视图 问题是垂直滚动并不像我期望的那么平滑 垂直滚动时有一些抽搐 Parent RecyclerView 如何消除这些垂直滚动抖动 我曾经在Par
  • 为什么修补/保存时日期/时间值解释不正确?

    我尝试保存 cakephp 3 表单中的数据 所有数据都保存得很好 但日期时间却没有 我有 2 个日期时间字段 这些字段由 jquery ui 小部件填充 问题似乎发生在打包实体时 intervention this gt Interven