mcpField
B
bitrix-datetime

bitrix-datetime

github.com/bxmaximum開発47274 回インストール2 週間前に更新
リポジトリ

bitrix-datetime について

PHP で Bitrix の日付・時刻型を扱う開発者向けのリファレンススキルです。解析、書式設定、演算、タイムゾーン、ORM の使い方に加え、カルチャーマスクやユーザー時刻変換の注意点を説明します。

主な機能

  1. 01Date と DateTime の型の動作
  2. 02解析と厳密な入力検証
  3. 03カルチャーマスクの書式変換
  4. 04日付演算と差分計算
  5. 05タイムゾーンとユーザー時刻の処理
  6. 06ORM の日付フィルター

活用シーン

  1. 01ユーザー入力の日付を検証
  2. 02サイトカルチャーに沿った日付表示
  3. 03日付間隔やオフセットの計算
  4. 04日付条件で ORM レコードを絞り込み

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bxmaximum/bitrix-framework-skills --skill bitrix-datetime

インストール後、Claude Code で/bitrix-datetimeを入力して読み込まれたか確認します。

詳細

日付と時刻

ベースライン:main 23.0+ · 検証済み:main 26.800.0

  • Bitrix\Main\Type\Date — 日付のみ(時刻は 00:00:00)です。\DateTime のサブクラスではありません。\DateTime をラップしているため、modify()、sub()、setTimestamp() は存在しません。
  • Bitrix\Main\Type\DateTime extends Date — 時刻、タイムゾーン、ユーザー時刻への変換を追加します。

使用可能なメソッド:format()、add()、setDate()、getTimestamp()、getDiff()、toString()。DateTime では、setTime()、setTimeZone()、setDefaultTimeZone()、toUserTime()、disableUserTime() も使用できます。

use Bitrix\Main\Type\Date;
use Bitrix\Main\Type\DateTime;

$d = new Date('25.11.2025', 'd.m.Y');                  // 2nd arg is a PHP format
$dt = new DateTime('2025-11-25 14:30:00', 'Y-m-d H:i:s', new \DateTimeZone('UTC'));
$now = new DateTime();
$fromSite = new DateTime($request->get('DATE'));       // no format = site culture format; bad input throws ObjectException

ユーザー入力の解析

$dt = DateTime::tryParse($input, 'd.m.Y H:i');         // null on error
$isValid = $dt !== null && $dt->format('d.m.Y H:i') === $input;   // strict

Date::isCorrect('31.02.2025', 'd.m.Y') は true を返します。パーサーが日付を繰り越して 03.03.2025 にします。上記の厳密な往復検証か、checkdate() を使用してください。

その他のソース:DateTime::createFromTimestamp($ts)、DateTime::createFromPhp(\DateTime $php)(\DateTimeImmutable の場合は、先に \DateTime::createFromImmutable() が必要です)、Date::createFromText('tomorrow')(DateTime|null を返します)。

カルチャー形式とマスク

カルチャー(Context::getCurrent()->getCulture())には、PHP 形式ではなく サイトのマスク(DD.MM.YYYY HH:MI:SS)が格納されています。これらを format() に渡さないでください。

$culture = \Bitrix\Main\Context::getCurrent()->getCulture();
echo $dt->toString($culture);                           // culture format, user TZ
echo $dt->format(DateTime::getFormat($culture));        // culture format, no TZ shift
echo $d->format(Date::convertFormatToPhp($culture->getDateFormat()));

Date::convertFormatToPhp():

マスクPHP備考
YYYY、MMMM、MM、DDY、F、m、d
MI、SSi、s
HH / HH / h単独の H(HH ではない場合)は 12 時間制です
GG / GG / g同じルールですが、先頭にゼロを付けません
TT / TA / aAM/PM

日時の計算

add() はオブジェクトを変更し、そのオブジェクトを返します。ISO 間隔(P10D、-P1M、PT30M)と相対テキスト(+2 weeks、-3 days)を受け付けます。

$tomorrow = (clone $now)->add('P1D');
$dayStart = (clone $now)->setTime(0, 0);
$monday = (clone $dayStart)->add('-' . ((int)$now->format('N') - 1) . ' days');
$days = $d1->getDiff($d2)->days;                        // \DateInterval from $d1 to $d2

タイムゾーン

値は サーバー 時刻で保持されます。メインモジュールでタイムゾーンが有効になっている場合、ユーザーにはそれぞれのタイムゾーンで表示されます。

呼び出し結果
(string)$dt、$dt->toString()カルチャー形式で ユーザー の TZ(有効で、オブジェクトで無効化されていない場合)
$dt->format(...)オブジェクト自身の TZ(設定されていなければサーバー TZ。上記の UTC の例を参照)で、ユーザーの時刻に変換されることはありません
$dt->disableUserTime()toString() はサーバー時刻のままです。ログ、メール、サーバー TZ の人間向けテキストに使用します
DateTime::createFromUserTime($str)ユーザー TZ の文字列をサーバー時刻として解析します
$dt->toUserTime()オブジェクト自体の時刻を変換します。必ずクローンに対して使用し、保存しないでください

従来の書き込み処理(CAgent::AddAgent、$DB->Add() / PrepareUpdate())では、日付文字列に CDatabase::CharToDateFunction() が適用され、ユーザーオフセットが差し引かれます。ユーザー時刻 の文字列を渡してください。disableUserTime() ではなく、通常の toString() を使用します。

\CAgent::AddAgent(
    MyAgent::class . '::run();',
    'vendor.module',
    'N',
    60,
    '',
    'Y',
    (new DateTime())->add('+5 minutes')->toString(),   // user time; the kernel shifts it back
);

ORM

DateField は Date を返し、DatetimeField は DateTime を返します。フィルターには文字列ではなくオブジェクトを使用してください。

PostTable::query()->setSelect(['ID'])->where('CREATED_AT', '>', (new DateTime())->add('-P7D'))->fetchAll();

SQL レベルでは、DateTime はサーバー TZ で書き込まれます(bitrix-database)。\DateTimeInterface を必要とするサードパーティーコードでは、\DateTime::createFromFormat('U', (string)$dt->getTimestamp()) を使用してください。

コメント