3v4l.org

run code in 300+ PHP versions simultaneously
<?php /* In the "verbose setup method" I'm trying setup the DateTime object myself to see if it's the format string which is parsed in correctly or if it's the DateTime object which is breaking stuff. From the testing it appears DateTime is broken somehow. */ $ss = 'first day of last month midnight'; $es = 'first day of this month midnight - 1 second'; $s = new DateTime($ss); $s->setTimeZone(new DateTimeZone('UTC')); $e = new DateTime($es); $e->setTimeZone(new DateTimeZone('UTC')); var_dump($s); var_dump($e); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d = $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* Next we will try mix/match the code to see what happens, surprisingly it seems that the end date ($e) is the important one, if it uses the verbose method it returns the correct values. */ $s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = new DateTime($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = new DateTime($ss); $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* This test just proves that the $e date is important BUT NOT because it's the one we call the diff() method on, that's just coincidental that seems to imply that the "- 1 second" in the date string is the problem. */ $s = new DateTime($ss); $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $s->diff($e); var_dump($d->days); // 30 ... and should be 30 /* [Workaround] This final test seems to prove that the input string is important and that the "- 1 secord" has a negative knock-on effect on the results of the diff. By modifying the datetime with ->modify everything works as expected ... it just means you have to be careful of how we work with DateTimes . */ $s = new DateTime($ss); $e = new DateTime('first day of this month midnight'); $e->modify('- 1 second'); var_dump($e->diff($s)->days); // 30 ... and should be 30
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/P8IPg
function name:  (null)
number of ops:  149
compiled vars:  !0 = $ss, !1 = $es, !2 = $s, !3 = $e, !4 = $d
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    7     0  E >   ASSIGN                                                   !0, 'first+day+of+last+month+midnight'
    8     1        ASSIGN                                                   !1, 'first+day+of+this+month+midnight+-+1+second'
    9     2        NEW                                              $7      'DateTime'
          3        SEND_VAR_EX                                              !0
          4        DO_FCALL                                      0          
          5        ASSIGN                                                   !2, $7
   10     6        INIT_METHOD_CALL                                         !2, 'setTimeZone'
          7        NEW                                              $10     'DateTimeZone'
          8        SEND_VAL_EX                                              'UTC'
          9        DO_FCALL                                      0          
         10        SEND_VAR_NO_REF_EX                                       $10
         11        DO_FCALL                                      0          
   11    12        NEW                                              $13     'DateTime'
         13        SEND_VAR_EX                                              !1
         14        DO_FCALL                                      0          
         15        ASSIGN                                                   !3, $13
   12    16        INIT_METHOD_CALL                                         !3, 'setTimeZone'
         17        NEW                                              $16     'DateTimeZone'
         18        SEND_VAL_EX                                              'UTC'
         19        DO_FCALL                                      0          
         20        SEND_VAR_NO_REF_EX                                       $16
         21        DO_FCALL                                      0          
   13    22        INIT_FCALL                                               'var_dump'
         23        SEND_VAR                                                 !2
         24        DO_ICALL                                                 
   14    25        INIT_FCALL                                               'var_dump'
         26        SEND_VAR                                                 !3
         27        DO_ICALL                                                 
   15    28        INIT_METHOD_CALL                                         !3, 'diff'
         29        SEND_VAR_EX                                              !2
         30        DO_FCALL                                      0  $21     
         31        ASSIGN                                                   !4, $21
   16    32        INIT_FCALL                                               'var_dump'
         33        FETCH_OBJ_R                                      ~23     !4, 'days'
         34        SEND_VAL                                                 ~23
         35        DO_ICALL                                                 
   17    36        NEW                                              $25     'DateTime'
         37        SEND_VAL_EX                                              null
         38        DO_FCALL                                      0          
         39        INIT_METHOD_CALL                                         $25, 'setTimestamp'
         40        INIT_FCALL                                               'strtotime'
         41        SEND_VAR                                                 !0
         42        DO_ICALL                                         $27     
         43        SEND_VAR_NO_REF_EX                                       $27
         44        DO_FCALL                                      0  $28     
         45        ASSIGN                                                   !2, $28
   18    46        NEW                                              $30     'DateTime'
         47        SEND_VAL_EX                                              null
         48        DO_FCALL                                      0          
         49        INIT_METHOD_CALL                                         $30, 'setTimestamp'
         50        INIT_FCALL                                               'strtotime'
         51        SEND_VAR                                                 !1
         52        DO_ICALL                                         $32     
         53        SEND_VAR_NO_REF_EX                                       $32
         54        DO_FCALL                                      0  $33     
         55        ASSIGN                                                   !3, $33
   19    56        INIT_METHOD_CALL                                         !3, 'diff'
         57        SEND_VAR_EX                                              !2
         58        DO_FCALL                                      0  $35     
         59        ASSIGN                                                   !4, $35
   20    60        INIT_FCALL                                               'var_dump'
         61        FETCH_OBJ_R                                      ~37     !4, 'days'
         62        SEND_VAL                                                 ~37
         63        DO_ICALL                                                 
   25    64        NEW                                              $39     'DateTime'
         65        SEND_VAL_EX                                              null
         66        DO_FCALL                                      0          
         67        INIT_METHOD_CALL                                         $39, 'setTimestamp'
         68        INIT_FCALL                                               'strtotime'
         69        SEND_VAR                                                 !0
         70        DO_ICALL                                         $41     
         71        SEND_VAR_NO_REF_EX                                       $41
         72        DO_FCALL                                      0  $42     
         73        ASSIGN                                                   !2, $42
   26    74        NEW                                              $44     'DateTime'
         75        SEND_VAR_EX                                              !1
         76        DO_FCALL                                      0          
         77        ASSIGN                                                   !3, $44
   27    78        INIT_METHOD_CALL                                         !3, 'diff'
         79        SEND_VAR_EX                                              !2
         80        DO_FCALL                                      0  $47     
         81        ASSIGN                                                   !4, $47
   28    82        INIT_FCALL                                               'var_dump'
         83        FETCH_OBJ_R                                      ~49     !4, 'days'
         84        SEND_VAL                                                 ~49
         85        DO_ICALL                                                 
   29    86        NEW                                              $51     'DateTime'
         87        SEND_VAR_EX                                              !0
         88        DO_FCALL                                      0          
         89        ASSIGN                                                   !2, $51
   30    90        NEW                                              $54     'DateTime'
         91        SEND_VAL_EX                                              null
         92        DO_FCALL                                      0          
         93        INIT_METHOD_CALL                                         $54, 'setTimestamp'
         94        INIT_FCALL                                               'strtotime'
         95        SEND_VAR                                                 !1
         96        DO_ICALL                                         $56     
         97        SEND_VAR_NO_REF_EX                                       $56
         98        DO_FCALL                                      0  $57     
         99        ASSIGN                                                   !3, $57
   31   100        INIT_METHOD_CALL                                         !3, 'diff'
        101        SEND_VAR_EX                                              !2
        102        DO_FCALL                                      0  $59     
        103        ASSIGN                                                   !4, $59
   32   104        INIT_FCALL                                               'var_dump'
        105        FETCH_OBJ_R                                      ~61     !4, 'days'
        106        SEND_VAL                                                 ~61
        107        DO_ICALL                                                 
   37   108        NEW                                              $63     'DateTime'
        109        SEND_VAR_EX                                              !0
        110        DO_FCALL                                      0          
        111        ASSIGN                                                   !2, $63
   38   112        NEW                                              $66     'DateTime'
        113        SEND_VAL_EX                                              null
        114        DO_FCALL                                      0          
        115        INIT_METHOD_CALL                                         $66, 'setTimestamp'
        116        INIT_FCALL                                               'strtotime'
        117        SEND_VAR                                                 !1
        118        DO_ICALL                                         $68     
        119        SEND_VAR_NO_REF_EX                                       $68
        120        DO_FCALL                                      0  $69     
        121        ASSIGN                                                   !3, $69
   39   122        INIT_METHOD_CALL                                         !2, 'diff'
        123        SEND_VAR_EX                                              !3
        124        DO_FCALL                                      0  $71     
        125        ASSIGN                                                   !4, $71
   40   126        INIT_FCALL                                               'var_dump'
        127        FETCH_OBJ_R                                      ~73     !4, 'days'
        128        SEND_VAL                                                 ~73
        129        DO_ICALL                                                 
   47   130        NEW                                              $75     'DateTime'
        131        SEND_VAR_EX                                              !0
        132        DO_FCALL                                      0          
        133        ASSIGN                                                   !2, $75
   48   134        NEW                                              $78     'DateTime'
        135        SEND_VAL_EX                                              'first+day+of+this+month+midnight'
        136        DO_FCALL                                      0          
        137        ASSIGN                                                   !3, $78
   49   138        INIT_METHOD_CALL                                         !3, 'modify'
        139        SEND_VAL_EX                                              '-+1+second'
        140        DO_FCALL                                      0          
   50   141        INIT_FCALL                                               'var_dump'
        142        INIT_METHOD_CALL                                         !3, 'diff'
        143        SEND_VAR_EX                                              !2
        144        DO_FCALL                                      0  $82     
        145        FETCH_OBJ_R                                      ~83     $82, 'days'
        146        SEND_VAL                                                 ~83
        147        DO_ICALL                                                 
        148      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
142.82 ms | 1408 KiB | 17 Q