3v4l.org

run code in 300+ PHP versions simultaneously
<?php $ss = 'first day of this month midnight'; $es = 'first day of next month midnight - 1 second'; $s = new DateTime($ss); $e = new DateTime($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 // This should be 0 because: // * "first day of last month midnight" is 2016-12-01T00:00:00" // * "first day of this month midnight - 1 second" is 2016-12-01T23:59:59+11:00 // because right to left. First the expression "midnight -1 second" "first day of this month" $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 echo "\n\n Same stuff with DateTimeImmutable\n"; $s = new DateTimeImmutable($ss); $e = new DateTimeImmutable($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = (new DateTimeImmutable(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = (new DateTimeImmutable(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 DateTimeImmutable(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = new DateTimeImmutable($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = new DateTimeImmutable($ss); $e = (new DateTimeImmutable(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 DateTimeImmutable($ss); $e = (new DateTimeImmutable(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 DateTimeImmutable($ss); $e = new DateTimeImmutable('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/hjFnN
function name:  (null)
number of ops:  260
compiled vars:  !0 = $ss, !1 = $es, !2 = $s, !3 = $e, !4 = $d
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    3     0  E >   ASSIGN                                                   !0, 'first+day+of+this+month+midnight'
    4     1        ASSIGN                                                   !1, 'first+day+of+next+month+midnight+-+1+second'
    5     2        NEW                                              $7      'DateTime'
          3        SEND_VAR_EX                                              !0
          4        DO_FCALL                                      0          
          5        ASSIGN                                                   !2, $7
    6     6        NEW                                              $10     'DateTime'
          7        SEND_VAR_EX                                              !1
          8        DO_FCALL                                      0          
          9        ASSIGN                                                   !3, $10
    7    10        INIT_METHOD_CALL                                         !3, 'diff'
         11        SEND_VAR_EX                                              !2
         12        DO_FCALL                                      0  $13     
         13        ASSIGN                                                   !4, $13
    8    14        INIT_FCALL                                               'var_dump'
         15        FETCH_OBJ_R                                      ~15     !4, 'days'
         16        SEND_VAL                                                 ~15
         17        DO_ICALL                                                 
   13    18        NEW                                              $17     'DateTime'
         19        SEND_VAL_EX                                              null
         20        DO_FCALL                                      0          
         21        INIT_METHOD_CALL                                         $17, 'setTimestamp'
         22        INIT_FCALL                                               'strtotime'
         23        SEND_VAR                                                 !0
         24        DO_ICALL                                         $19     
         25        SEND_VAR_NO_REF_EX                                       $19
         26        DO_FCALL                                      0  $20     
         27        ASSIGN                                                   !2, $20
   14    28        NEW                                              $22     'DateTime'
         29        SEND_VAL_EX                                              null
         30        DO_FCALL                                      0          
         31        INIT_METHOD_CALL                                         $22, 'setTimestamp'
         32        INIT_FCALL                                               'strtotime'
         33        SEND_VAR                                                 !1
         34        DO_ICALL                                         $24     
         35        SEND_VAR_NO_REF_EX                                       $24
         36        DO_FCALL                                      0  $25     
         37        ASSIGN                                                   !3, $25
   15    38        INIT_METHOD_CALL                                         !3, 'diff'
         39        SEND_VAR_EX                                              !2
         40        DO_FCALL                                      0  $27     
         41        ASSIGN                                                   !4, $27
   16    42        INIT_FCALL                                               'var_dump'
         43        FETCH_OBJ_R                                      ~29     !4, 'days'
         44        SEND_VAL                                                 ~29
         45        DO_ICALL                                                 
   21    46        NEW                                              $31     'DateTime'
         47        SEND_VAL_EX                                              null
         48        DO_FCALL                                      0          
         49        INIT_METHOD_CALL                                         $31, 'setTimestamp'
         50        INIT_FCALL                                               'strtotime'
         51        SEND_VAR                                                 !0
         52        DO_ICALL                                         $33     
         53        SEND_VAR_NO_REF_EX                                       $33
         54        DO_FCALL                                      0  $34     
         55        ASSIGN                                                   !2, $34
   22    56        NEW                                              $36     'DateTime'
         57        SEND_VAR_EX                                              !1
         58        DO_FCALL                                      0          
         59        ASSIGN                                                   !3, $36
   23    60        INIT_METHOD_CALL                                         !3, 'diff'
         61        SEND_VAR_EX                                              !2
         62        DO_FCALL                                      0  $39     
         63        ASSIGN                                                   !4, $39
   24    64        INIT_FCALL                                               'var_dump'
         65        FETCH_OBJ_R                                      ~41     !4, 'days'
         66        SEND_VAL                                                 ~41
         67        DO_ICALL                                                 
   25    68        NEW                                              $43     'DateTime'
         69        SEND_VAR_EX                                              !0
         70        DO_FCALL                                      0          
         71        ASSIGN                                                   !2, $43
   26    72        NEW                                              $46     'DateTime'
         73        SEND_VAL_EX                                              null
         74        DO_FCALL                                      0          
         75        INIT_METHOD_CALL                                         $46, 'setTimestamp'
         76        INIT_FCALL                                               'strtotime'
         77        SEND_VAR                                                 !1
         78        DO_ICALL                                         $48     
         79        SEND_VAR_NO_REF_EX                                       $48
         80        DO_FCALL                                      0  $49     
         81        ASSIGN                                                   !3, $49
   27    82        INIT_METHOD_CALL                                         !3, 'diff'
         83        SEND_VAR_EX                                              !2
         84        DO_FCALL                                      0  $51     
         85        ASSIGN                                                   !4, $51
   28    86        INIT_FCALL                                               'var_dump'
         87        FETCH_OBJ_R                                      ~53     !4, 'days'
         88        SEND_VAL                                                 ~53
         89        DO_ICALL                                                 
   33    90        NEW                                              $55     'DateTime'
         91        SEND_VAR_EX                                              !0
         92        DO_FCALL                                      0          
         93        ASSIGN                                                   !2, $55
   34    94        NEW                                              $58     'DateTime'
         95        SEND_VAL_EX                                              null
         96        DO_FCALL                                      0          
         97        INIT_METHOD_CALL                                         $58, 'setTimestamp'
         98        INIT_FCALL                                               'strtotime'
         99        SEND_VAR                                                 !1
        100        DO_ICALL                                         $60     
        101        SEND_VAR_NO_REF_EX                                       $60
        102        DO_FCALL                                      0  $61     
        103        ASSIGN                                                   !3, $61
   35   104        INIT_METHOD_CALL                                         !2, 'diff'
        105        SEND_VAR_EX                                              !3
        106        DO_FCALL                                      0  $63     
        107        ASSIGN                                                   !4, $63
   36   108        INIT_FCALL                                               'var_dump'
        109        FETCH_OBJ_R                                      ~65     !4, 'days'
        110        SEND_VAL                                                 ~65
        111        DO_ICALL                                                 
   43   112        NEW                                              $67     'DateTime'
        113        SEND_VAR_EX                                              !0
        114        DO_FCALL                                      0          
        115        ASSIGN                                                   !2, $67
   44   116        NEW                                              $70     'DateTime'
        117        SEND_VAL_EX                                              'first+day+of+this+month+midnight'
        118        DO_FCALL                                      0          
        119        ASSIGN                                                   !3, $70
   45   120        INIT_METHOD_CALL                                         !3, 'modify'
        121        SEND_VAL_EX                                              '-+1+second'
        122        DO_FCALL                                      0          
   46   123        INIT_FCALL                                               'var_dump'
        124        INIT_METHOD_CALL                                         !3, 'diff'
        125        SEND_VAR_EX                                              !2
        126        DO_FCALL                                      0  $74     
        127        FETCH_OBJ_R                                      ~75     $74, 'days'
        128        SEND_VAL                                                 ~75
        129        DO_ICALL                                                 
   49   130        ECHO                                                     '%0A%0A+Same+stuff+with+DateTimeImmutable%0A'
   51   131        NEW                                              $77     'DateTimeImmutable'
        132        SEND_VAR_EX                                              !0
        133        DO_FCALL                                      0          
        134        ASSIGN                                                   !2, $77
   52   135        NEW                                              $80     'DateTimeImmutable'
        136        SEND_VAR_EX                                              !1
        137        DO_FCALL                                      0          
        138        ASSIGN                                                   !3, $80
   53   139        INIT_METHOD_CALL                                         !3, 'diff'
        140        SEND_VAR_EX                                              !2
        141        DO_FCALL                                      0  $83     
        142        ASSIGN                                                   !4, $83
   54   143        INIT_FCALL                                               'var_dump'
        144        FETCH_OBJ_R                                      ~85     !4, 'days'
        145        SEND_VAL                                                 ~85
        146        DO_ICALL                                                 
   55   147        NEW                                              $87     'DateTimeImmutable'
        148        SEND_VAL_EX                                              null
        149        DO_FCALL                                      0          
        150        INIT_METHOD_CALL                                         $87, 'setTimestamp'
        151        INIT_FCALL                                               'strtotime'
        152        SEND_VAR                                                 !0
        153        DO_ICALL                                         $89     
        154        SEND_VAR_NO_REF_EX                                       $89
        155        DO_FCALL                                      0  $90     
        156        ASSIGN                                                   !2, $90
   56   157        NEW                                              $92     'DateTimeImmutable'
        158        SEND_VAL_EX                                              null
        159        DO_FCALL                                      0          
        160        INIT_METHOD_CALL                                         $92, 'setTimestamp'
        161        INIT_FCALL                                               'strtotime'
        162        SEND_VAR                                                 !1
        163        DO_ICALL                                         $94     
        164        SEND_VAR_NO_REF_EX                                       $94
        165        DO_FCALL                                      0  $95     
        166        ASSIGN                                                   !3, $95
   57   167        INIT_METHOD_CALL                                         !3, 'diff'
        168        SEND_VAR_EX                                              !2
        169        DO_FCALL                                      0  $97     
        170        ASSIGN                                                   !4, $97
   58   171        INIT_FCALL                                               'var_dump'
        172        FETCH_OBJ_R                                      ~99     !4, 'days'
        173        SEND_VAL                                                 ~99
        174        DO_ICALL                                                 
   63   175        NEW                                              $101    'DateTimeImmutable'
        176        SEND_VAL_EX                                              null
        177        DO_FCALL                                      0          
        178        INIT_METHOD_CALL                                         $101, 'setTimestamp'
        179        INIT_FCALL                                               'strtotime'
        180        SEND_VAR                                                 !0
        181        DO_ICALL                                         $103    
        182        SEND_VAR_NO_REF_EX                                       $103
        183        DO_FCALL                                      0  $104    
        184        ASSIGN                                                   !2, $104
   64   185        NEW                                              $106    'DateTimeImmutable'
        186        SEND_VAR_EX                                              !1
        187        DO_FCALL                                      0          
        188        ASSIGN                                                   !3, $106
   65   189        INIT_METHOD_CALL                                         !3, 'diff'
        190        SEND_VAR_EX                                              !2
        191        DO_FCALL                                      0  $109    
        192        ASSIGN                                                   !4, $109
   66   193        INIT_FCALL                                               'var_dump'
        194        FETCH_OBJ_R                                      ~111    !4, 'days'
        195        SEND_VAL                                                 ~111
        196        DO_ICALL                                                 
   67   197        NEW                                              $113    'DateTimeImmutable'
        198        SEND_VAR_EX                                              !0
        199        DO_FCALL                                      0          
        200        ASSIGN                                                   !2, $113
   68   201        NEW                                              $116    'DateTimeImmutable'
        202        SEND_VAL_EX                                              null
        203        DO_FCALL                                      0          
        204        INIT_METHOD_CALL                                         $116, 'setTimestamp'
        205        INIT_FCALL                                               'strtotime'
        206        SEND_VAR                                                 !1
        207        DO_ICALL                                         $118    
        208        SEND_VAR_NO_REF_EX                                       $118
        209        DO_FCALL                                      0  $119    
        210        ASSIGN                                                   !3, $119
   69   211        INIT_METHOD_CALL                                         !3, 'diff'
        212        SEND_VAR_EX                                              !2
        213        DO_FCALL                                      0  $121    
        214        ASSIGN                                                   !4, $121
   70   215        INIT_FCALL                                               'var_dump'
        216        FETCH_OBJ_R                                      ~123    !4, 'days'
        217        SEND_VAL                                                 ~123
        218        DO_ICALL                                                 
   75   219        NEW                                              $125    'DateTimeImmutable'
        220        SEND_VAR_EX                                              !0
        221        DO_FCALL                                      0          
        222        ASSIGN                                                   !2, $125
   76   223        NEW                                              $128    'DateTimeImmutable'
        224        SEND_VAL_EX                                              null
        225        DO_FCALL                                      0          
        226        INIT_METHOD_CALL                                         $128, 'setTimestamp'
        227        INIT_FCALL                                               'strtotime'
        228        SEND_VAR                                                 !1
        229        DO_ICALL                                         $130    
        230        SEND_VAR_NO_REF_EX                                       $130
        231        DO_FCALL                                      0  $131    
        232        ASSIGN                                                   !3, $131
   77   233        INIT_METHOD_CALL                                         !2, 'diff'
        234        SEND_VAR_EX                                              !3
        235        DO_FCALL                                      0  $133    
        236        ASSIGN                                                   !4, $133
   78   237        INIT_FCALL                                               'var_dump'
        238        FETCH_OBJ_R                                      ~135    !4, 'days'
        239        SEND_VAL                                                 ~135
        240        DO_ICALL                                                 
   85   241        NEW                                              $137    'DateTimeImmutable'
        242        SEND_VAR_EX                                              !0
        243        DO_FCALL                                      0          
        244        ASSIGN                                                   !2, $137
   86   245        NEW                                              $140    'DateTimeImmutable'
        246        SEND_VAL_EX                                              'first+day+of+this+month+midnight'
        247        DO_FCALL                                      0          
        248        ASSIGN                                                   !3, $140
   87   249        INIT_METHOD_CALL                                         !3, 'modify'
        250        SEND_VAL_EX                                              '-+1+second'
        251        DO_FCALL                                      0          
   88   252        INIT_FCALL                                               'var_dump'
        253        INIT_METHOD_CALL                                         !3, 'diff'
        254        SEND_VAR_EX                                              !2
        255        DO_FCALL                                      0  $144    
        256        FETCH_OBJ_R                                      ~145    $144, 'days'
        257        SEND_VAL                                                 ~145
        258        DO_ICALL                                                 
        259      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
167.7 ms | 1416 KiB | 17 Q