I have a server with Debian 10,Apache/2.4.38, MySQLi, mongodb and Php. The server is running a custom PHP program which allows users to upload their measurements (in .csv files) which are then stored in mongodb.
The uploaded .csv files must comply with a predetermined format in order to be uploaded, like so:
Timestamp,Measurement 1,Measurement 2,(etc) 05/06/20 00:15,201,1 05/06/20 00:30,305,4 05/06/20 00:45,400,65 . . (continues for the entire duration of the day/week/year)
The timestamp must be set every 15 minutes exactly. The code responsible for this check is:
//check time interval if (isset($document['timestamp']) && $time_step==false && $fileLine>1){ if ($interval>900){ $time_step=true; $condition_violated=True; $conditions_errors.="line ".$fileLine. " warning: The ".$key[$i]." condition is violated. rn"; file_put_contents($file_name,"line ".$fileLine. " error: One or more time instants are missing in the file you try to upload. Please check the consistency of the measurements in the file. rn",FILE_APPEND); } }
This works fine except one very specific date and time every year. When trying to upload a file starting on 22/02/19 00:15, and ending on 31/12/19 23:45, i get an error:
line 23724 error: One or more time instants are missing in the file you try to upload. Please check the consistency of the measurements in the file.
The above line is the date: 27/10/19 02:45 If i split the file in two different .csv files, the first one with lines 1-23723, and the second one with lines 23725-end, essentially skipping line 23724-date 27/10/19 02:45, the file uploads just fine.
If i try to upload a file with just the three following timesteps:
Timestamp,Measurement 1,Measurement 2,(etc) 27/10/19 02:30,0,0 27/10/19 02:45,0,0 27/10/19 03:00,0,0
I get the same error. Same issue appears for 25/10/20 02:45 in the entire 2020 year. Tried many .csv files, same error.
I am trying to understand whether there is something wrong with the OS, the PHP code or the database (mongodb). Any suggestions?
1st EDIT
@Buzz The code that checks the interval should be here:
for($i=0; $i < $numofcols; $i++){ $key[$i] =remove_utf8_bom($key[$i]) ; $min_max_violated=False; if ($key[$i] == "Timestamp"){ if(strlen($value[$i]) != 14){ $date_time_error=true; $dt=0; file_put_contents($file_name,"line ".$fileLine. " error: Date-Time format error.rn",FILE_APPEND); }else{ $document['timestamp'] = $value[$i]; if ($fileLine == 1){ $timestamp_to_cmp=DateTime::createFromFormat('d/m/y H:i',$document['timestamp'])->getTimestamp(); $dt=$timestamp_to_cmp; } else{ $dt = DateTime::createFromFormat('d/m/y H:i',$document['timestamp'])->getTimestamp(); $interval=$dt-$timestamp_to_cmp; /* echo json_encode(["dd"=>$interval]); exit(); */ } }
Mongodb comes in in a different .php file, i believe that the error is in this file.
Advertisement
Answer
The date 27/10/19 02:45 was the date when the timechange occurs. At that time instant PHP adds +3600 seconds to the measurement. Apparently, this only happens to debian installations, it worked without the change on Arch linux. I fixed it by adding:
date_default_timezone_set('UTC');
at the start of the file where the PHP checks the time interval.