Realmente lidar com isso é extremamente complicado. Eu vou só dar uma pincelada superficial.
Se vai trabalhar com datas, não use horário junto. Se fizer isso não terá muitos problemas. Se a tecnologia usada não tem data sozinha, azar, você terá que pelo menos na manipulação desconsiderar e zera o horário sempre, aí não dá problema com fuso horário.
Utilize sempre tipos prontos para lidar com isso, a não ser que não tenha outra forma. Em geral é mais bem feito do que você poderá fazer. O assunto é complexo demais, e cheio de armadilhas para você tentar reproduzir. Dá muito trabalho e provavelmente será bugado. Isso vale até para banco de dados, não se deve inventar maneira de armazenar (o SQLite não tem data, tem que usar uma forma de timestamp e definir regras).
Para problemas de fuso, tem solução relativamente simples. A não ser que tenha uma indicação para fazer diferente deve-se trabalhar com UTC, ou seja, fuso horário neutro. Assim não dá problema. Somente na interação com o cliente é que o fuso deve ser considerado (se fizer sentido), então quando o usuário escolhe um horário ou vai mostra para ele é feita uma conversão entre UTC e o fuso que se sabe que ele usa. E o ideal é usar algo pronto e não tentar reinventar a roda que é difícil. A maior parte das soluções que as pessoas apresentam são gambiarras.
Eu acho que o kht dará uma resposta mais completa, já que ele tem até livro publicado sobre o assunto.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).