Handling date and time is a perennial software problem; exacerbated by the fact that most programming languages do not differentiate between a date and a datetime.
In order to deal with this, we explicitly recognise and code for the fact that there are typically three different things being talked about when discussing time:
 Time zone aware datetime
These are a point in time (usually stored as UTC) which, when presented to the user, will show the equivalent datetime in their time zone. The programmer also has to account for the fact that datetimes entered will come in from the perspective of that user so need to be converted back to UTC for storage.