Molte risposte qui indicano la memorizzazione come UTC. Ma stai molto attento a questo. Ad esempio, se si pianifica un appuntamento alle 12:00, ma l'appuntamento avviene dopo la modifica all'ora legale, che cosa accadrà? UTC non conserva alcuna informazione sul fatto che dst fosse attivo quando l'appuntamento è stato memorizzato. Un sacco di grandi e famosi sistemi hanno commesso questo errore, in cui un utente invia un'e-mail alle 9:00 in estate, e in inverno l'ora inviata mostra 8am, perché il calcolo di ritorno da UTC dipende da quando si guarda il datetime, non attivo quando è stato registrato il datetime.
Molto meglio è supporre che il tuo utente desideri avere sempre le volte che ha scelto. Nessuna conversione UTC, nessuna conversione di orario, nessuna informazione sul fuso orario, niente. Prendere un appuntamento dalle 8:00 alle 12:00 il 21 marzo 2016 è proprio questo. Non utilizzare l'ora locale o l'ora UTC, ma il tempo non specificato (in json questo non ha né z né +, in pratica, in .NET questo ha DateTime.Kind = DateTimeKind.Unspecified).
Ovviamente, se il tuo caso d'uso è che sei un'azienda che tiene riunioni con qualcuno da fusi orari diversi e vuoi vedere queste informazioni in, ad esempio, un calendario aziendale, ma permetti agli utenti di vedere che ora è nel loro fuso orario, diventa più complicato. Il tempo deve essere corretto per persone diverse in diversi fusi orari (il fornitore e il cliente).
In questi casi, potresti anche voler registrare quando l'appuntamento è stato salvato nel database, in quale fuso orario e se includeva dst o no. In questo modo, puoi sempre calcolare l'ora locale a qualsiasi altra cosa, o a ciò che sarebbe ora o a ciò che intendeva essere storicamente. Perché i fusi orari non sono molto statici, rendendo le cose ancora più complicate.
Fortunatamente, è qui che arrivano le librerie come link e sono altamente raccomandate. Lavorano con date molto più coerenti. Anche in questo caso, consiglierei di includere tutte le variabili e la logica datetime nei propri wrapper, utilizzando le interfacce in modo che possano essere prese in giro, e quindi è possibile comunque passare alla logica in un secondo momento.