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/XqkRH
function name:  (null)
number of ops:  137
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
   11     6        NEW                                              $10     'DateTime'
          7        SEND_VAR_EX                                              !1
          8        DO_FCALL                                      0          
          9        ASSIGN                                                   !3, $10
   13    10        INIT_FCALL                                               'var_dump'
         11        SEND_VAR                                                 !2
         12        DO_ICALL                                                 
   14    13        INIT_FCALL                                               'var_dump'
         14        SEND_VAR                                                 !3
         15        DO_ICALL                                                 
   15    16        INIT_METHOD_CALL                                         !3, 'diff'
         17        SEND_VAR_EX                                              !2
         18        DO_FCALL                                      0  $15     
         19        ASSIGN                                                   !4, $15
   16    20        INIT_FCALL                                               'var_dump'
         21        FETCH_OBJ_R                                      ~17     !4, 'days'
         22        SEND_VAL                                                 ~17
         23        DO_ICALL                                                 
   17    24        NEW                                              $19     'DateTime'
         25        SEND_VAL_EX                                              null
         26        DO_FCALL                                      0          
         27        INIT_METHOD_CALL                                         $19, 'setTimestamp'
         28        INIT_FCALL                                               'strtotime'
         29        SEND_VAR                                                 !0
         30        DO_ICALL                                         $21     
         31        SEND_VAR_NO_REF_EX                                       $21
         32        DO_FCALL                                      0  $22     
         33        ASSIGN                                                   !2, $22
   18    34        NEW                                              $24     'DateTime'
         35        SEND_VAL_EX                                              null
         36        DO_FCALL                                      0          
         37        INIT_METHOD_CALL                                         $24, 'setTimestamp'
         38        INIT_FCALL                                               'strtotime'
         39        SEND_VAR                                                 !1
         40        DO_ICALL                                         $26     
         41        SEND_VAR_NO_REF_EX                                       $26
         42        DO_FCALL                                      0  $27     
         43        ASSIGN                                                   !3, $27
   19    44        INIT_METHOD_CALL                                         !3, 'diff'
         45        SEND_VAR_EX                                              !2
         46        DO_FCALL                                      0  $29     
         47        ASSIGN                                                   !4, $29
   20    48        INIT_FCALL                                               'var_dump'
         49        FETCH_OBJ_R                                      ~31     !4, 'days'
         50        SEND_VAL                                                 ~31
         51        DO_ICALL                                                 
   25    52        NEW                                              $33     'DateTime'
         53        SEND_VAL_EX                                              null
         54        DO_FCALL                                      0          
         55        INIT_METHOD_CALL                                         $33, 'setTimestamp'
         56        INIT_FCALL                                               'strtotime'
         57        SEND_VAR                                                 !0
         58        DO_ICALL                                         $35     
         59        SEND_VAR_NO_REF_EX                                       $35
         60        DO_FCALL                                      0  $36     
         61        ASSIGN                                                   !2, $36
   26    62        NEW                                              $38     'DateTime'
         63        SEND_VAR_EX                                              !1
         64        DO_FCALL                                      0          
         65        ASSIGN                                                   !3, $38
   27    66        INIT_METHOD_CALL                                         !3, 'diff'
         67        SEND_VAR_EX                                              !2
         68        DO_FCALL                                      0  $41     
         69        ASSIGN                                                   !4, $41
   28    70        INIT_FCALL                                               'var_dump'
         71        FETCH_OBJ_R                                      ~43     !4, 'days'
         72        SEND_VAL                                                 ~43
         73        DO_ICALL                                                 
   29    74        NEW                                              $45     'DateTime'
         75        SEND_VAR_EX                                              !0
         76        DO_FCALL                                      0          
         77        ASSIGN                                                   !2, $45
   30    78        NEW                                              $48     'DateTime'
         79        SEND_VAL_EX                                              null
         80        DO_FCALL                                      0          
         81        INIT_METHOD_CALL                                         $48, 'setTimestamp'
         82        INIT_FCALL                                               'strtotime'
         83        SEND_VAR                                                 !1
         84        DO_ICALL                                         $50     
         85        SEND_VAR_NO_REF_EX                                       $50
         86        DO_FCALL                                      0  $51     
         87        ASSIGN                                                   !3, $51
   31    88        INIT_METHOD_CALL                                         !3, 'diff'
         89        SEND_VAR_EX                                              !2
         90        DO_FCALL                                      0  $53     
         91        ASSIGN                                                   !4, $53
   32    92        INIT_FCALL                                               'var_dump'
         93        FETCH_OBJ_R                                      ~55     !4, 'days'
         94        SEND_VAL                                                 ~55
         95        DO_ICALL                                                 
   37    96        NEW                                              $57     'DateTime'
         97        SEND_VAR_EX                                              !0
         98        DO_FCALL                                      0          
         99        ASSIGN                                                   !2, $57
   38   100        NEW                                              $60     'DateTime'
        101        SEND_VAL_EX                                              null
        102        DO_FCALL                                      0          
        103        INIT_METHOD_CALL                                         $60, 'setTimestamp'
        104        INIT_FCALL                                               'strtotime'
        105        SEND_VAR                                                 !1
        106        DO_ICALL                                         $62     
        107        SEND_VAR_NO_REF_EX                                       $62
        108        DO_FCALL                                      0  $63     
        109        ASSIGN                                                   !3, $63
   39   110        INIT_METHOD_CALL                                         !2, 'diff'
        111        SEND_VAR_EX                                              !3
        112        DO_FCALL                                      0  $65     
        113        ASSIGN                                                   !4, $65
   40   114        INIT_FCALL                                               'var_dump'
        115        FETCH_OBJ_R                                      ~67     !4, 'days'
        116        SEND_VAL                                                 ~67
        117        DO_ICALL                                                 
   47   118        NEW                                              $69     'DateTime'
        119        SEND_VAR_EX                                              !0
        120        DO_FCALL                                      0          
        121        ASSIGN                                                   !2, $69
   48   122        NEW                                              $72     'DateTime'
        123        SEND_VAL_EX                                              'first+day+of+this+month+midnight'
        124        DO_FCALL                                      0          
        125        ASSIGN                                                   !3, $72
   49   126        INIT_METHOD_CALL                                         !3, 'modify'
        127        SEND_VAL_EX                                              '-+1+second'
        128        DO_FCALL                                      0          
   50   129        INIT_FCALL                                               'var_dump'
        130        INIT_METHOD_CALL                                         !3, 'diff'
        131        SEND_VAR_EX                                              !2
        132        DO_FCALL                                      0  $76     
        133        FETCH_OBJ_R                                      ~77     $76, 'days'
        134        SEND_VAL                                                 ~77
        135        DO_ICALL                                                 
        136      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
182.31 ms | 1404 KiB | 17 Q