Fix schedules around midnight

Around midnight the app didn't work well because it didn't retrieve the
correct schedules. Also, the way the frontend was architectured, trains
which were scheduled after midnight appeared for 1 second and then

This CL fixes this by changing the following:

- The API now returns arrival and departure times by specifying a UNIX
  timestamp instead of the seconds since midnight. This helps simplify
  the code in the frontend.
- Adapting the frontend to consume the new timestamps, to fix the
  disappearing schedule bug.
- Fixing the SQL query to get the stop times, since it didn't retrieve
  the correct rows.

Fixed: misc:17

Change-Id: I98f1fe20d44163e716d4f57a2018635be74526d0
3 files changed
tree: abea7fe238f41ccb89af6e7c10decb317835bfb4
  1. ajax/
  2. cron/
  3. css/
  4. img/
  5. inc/
  6. js/
  7. proto/
  8. vendor/
  10. .gitignore
  11. .gitreview
  12. composer.json
  13. composer.lock
  14. config.default.php
  15. core.php
  16. index.php
  17. info.php
  19. offline.html
  21. sw.js


Schedule viewer for the Barcelona subway.


  1. Clone this repository (usually in Apache's publicly accessible folder).
  2. Install PHP 7.2+ with the ZipArchive and PDO classes (specifically install the PDO_SQLITE driver)
  3. Copy the config.default.php file to config.php and fill in the details (you can get an API key directly from TMB here.
    • In $conf["databaseFile"] enter the absolute path of the location where you want to save your database (including the file name). If the website is located in the /var/www/html/schedules/ folder, you can create a new files folder there and set the variable to /var/www/html/schedules/files/gtfs.sqlite3.
  4. Run the cron/parsegtfs.php script regularly to get updated information (e.g. once a week).


  • As I've been able to see when using this app around Barcelona, the schedules provided by TMB are a very vague approximation of the departure times for all lines except for the automated lines. In the case of the automated lines, the timing is precise within a second.