Тут багато відповідей вказують на зберігання як UTC. Але будьте дійсно обережні з цим. Наприклад, якщо ви запланували зустріч на 12:00, але зустріч відбудеться після зміни літнього часу, що буде? UTC не зберігає жодної інформації про те, чи був активний dst під час збереження зустрічі. Багато великих, відомих систем зробили цю помилку, коли користувач надсилає електронне повідомлення о 9 ранку влітку, а потім взимку відправлений час показує 8 ранку, тому що обчислення назад від UTC залежить від того, коли ви дивитесь на дату, не увімкнено, коли записано дату.
Набагато краще - припустити, що ваш користувач хоче мати завжди вибраний час. Ні перетворення UTC, ні перетворення часу, ні інформація про часовий пояс, нічого. Записатися на зустріч з 08:00 до 12:00 21 березня 2016 року - це саме так. Не використовуйте ні місцевий час, ні UTC, але не визначений час (у json це не має ні z, ні +, в основному, у .NET це має DateTime.Kind = DateTimeKind.Unspecified).
Звичайно, якщо ваш випадок використання полягає в тому, що ви є компанією, яка проводить зустрічі з кимось із різних часових поясів, і ви хочете побачити цю інформацію в, скажімо, календарі компанії, але дозволяєте користувачам бачити, який час знаходиться в їх часовому поясі, це ускладнюється. Час повинен бути правильним для різних людей у різних часових поясах (постачальник та замовник).
У цих випадках ви навіть можете записати, коли зустріч була збережена в базі даних, в який часовий пояс і якщо вона включала dst чи ні. Таким чином, ви завжди можете обчислити місцевий час на будь-що інше, або на те, що це було б зараз, або на те, що було призначено історично. Тому що часові пояси дуже не статичні, що робить речі ще складнішими.
На щастя, сюди надходять такі бібліотеки, як http://nodatime.org/, і настійно рекомендуються. Вони працюють з датами набагато послідовніше. Навіть тоді я рекомендую обгортати всі ваші змінні дати та логіку у ваші власні обгортки, використовуючи інтерфейси, щоб їх можна було глузувати, а потім ви все одно можете перемикати логіку пізніше.