3v4l.org

run code in 500+ 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.5.0


preferences:
162.59 ms | 2433 KiB | 15 Q