質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2522閲覧

PHPのDateIntervalオブジェクトでマイクロ秒の計算をしたい

lPxMK1WQ

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/03/07 04:42

編集2019/03/07 07:24

前提・実現したいこと

PHP7.3のDateTimeオブジェクトでマイクロ秒単位の計算を行いたいです。

そのためにDateTime->add/sub に渡すDateIntervalオブジェクトを作成しようとしていますが、
マイクロ秒の精度で作成する方法がわかりません。

DateIntervalオブジェクトにマイクロ秒を設定する方法や、
DateTimeオブジェクトで計算を行う他の方法、
DateTimeよりも日時の計算において使い勝手のいいライブラリがあればご教示頂きたいです。

発生している問題・エラーメッセージ

PHP Fatal error: Uncaught Exception: DateInterval::__construct(): Unknown or bad format (PT0.123456S) in /var/www/html/apps/controllers/a:4 Stack trace: #0 /var/www/html/apps/controllers/a(4): DateInterval->__construct('PT0.123456S') #1 {main} thrown in /var/www/html/apps/controllers/a on line 4

該当のソースコード

php

1<?php 2 3$date = new DateTime("2019-03-07T13:00:00.123456"); 4$interval = new DateInterval("PT0.123456S"); // 上記エラーが発生 5//$interval = new DateInterval("PT123456F"); // あてずっぽうに指定するもエラー 6var_dump($interval); // ["f"]=>float(0.123456) が表示されてほしい 7var_dump($date->sub($interval)); // "2019-03-07T13:00:00.000000" が表示されてほしい

試したこと

公式のマニュアルで対応するPeriod Designatorを確認するも見つからず、
Examplesのvar_dumpの出力にマイクロ秒のフィールドが無いことからマニュアルが古そうだと思い質問しました。

http://php.net/manual/en/dateinterval.construct.php

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コンストラクタに与える文字列でマイクロ秒を指定する方法はいまのところなさそうです。この文字列のパーサのソース(ext/date/lib/parse_iso_intervals.re)の中にはusフィールドを0に初期化する以外に触っているところはありませんでした。

DateInterval$fプロパティを直接操作することはできますのでそれでやるしかないのではないでしょうか。

php

1<?php 2 3$interval = new DateInterval('PT0S'); 4$interval->f = 0.01; 5var_dump($interval); 6var_dump($interval->format('%F'));

text

1object(DateInterval)#1 (16) { 2 ["y"]=> 3 int(0) 4 ["m"]=> 5 int(0) 6 ["d"]=> 7 int(0) 8 ["h"]=> 9 int(0) 10 ["i"]=> 11 int(0) 12 ["s"]=> 13 int(0) 14 ["f"]=> 15 float(0.01) 16 ["weekday"]=> 17 int(0) 18 ["weekday_behavior"]=> 19 int(0) 20 ["first_last_day_of"]=> 21 int(0) 22 ["invert"]=> 23 int(0) 24 ["days"]=> 25 bool(false) 26 ["special_type"]=> 27 int(0) 28 ["special_amount"]=> 29 int(0) 30 ["have_weekday_relative"]=> 31 int(0) 32 ["have_special_relative"]=> 33 int(0) 34} 35string(6) "010000"

かなり前(2011年!)からISO8601に準拠して小数点を含んだ形式を扱えるようにして欲しいという要望はあるようですが残念ながら対処は行われていません。

Request #53831 DateInterval constructor does not handle valid ISO 8601 strings

投稿2019/03/07 06:44

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lPxMK1WQ

2019/03/07 07:21

回答ありがとうございます。 やりたい事はこれで実現できました! ここを触ってしまってもいいのか、という気持ちはありましたが………
guest

0

PHP: time - Manual関数だって秒単位だし、
DateTimeクラスにそこまでの精度を期待しちゃいけないので、
PHP: HRTime - Manual
など使ってはどうかなと。


ぐぐると
[PHP] ミリ秒やマイクロ秒を含む現在時間を取得するクラスと関数 - JoyPlotドキュメント
microtime()使うっぽい。

投稿2019/03/07 05:49

編集2019/03/07 06:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lPxMK1WQ

2019/03/07 07:25 編集

回答ありがとうございます。 ただ、マニュアルを読んでみたところ、HRTimeはタイマーであって インスタンスに任意の値をセットしたり差をとったりといった、 時刻の計算には使えそうにありませんでした。
lPxMK1WQ

2019/03/07 07:08

microtime()は現在時刻を取得する関数のようです。 任意の日時を表現するものではなく、 DateIntervalオブジェクトを返すものでもないので すみませんがこちらも使えそうにないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問