日付とタイムゾーンの変換の処理: 適切な UTC 変換が重要な理由

WBOY
リリース: 2024-09-08 22:34:39
オリジナル
292 人が閲覧しました

Handling Date and Timezone Conversions: Why Proper UTC Conversion Matters

選択した日付範囲のデータを取得中に、計算が若干の誤差があることに気付きました。しかし、日付を 1 日減らすと、データは正確に一致しました。

うーん…コード内での日付の処理方法に問題がある可能性があります。おそらくタイムゾーンが正しく処理されていません。はい、私は正しかったです!

異なるタイムゾーンのユーザーが関与するアプリケーションを構築する場合、日付を適切に処理するのは難しい場合があります。日付を UTC で保存することは、一貫性を確保するための一般的なベスト プラクティスですが、ユーザーがローカル タイムゾーンで日付を入力する場合、特にフィルタリングやクエリ中に状況が複雑になる可能性があります。

開発者は、これらの変換を処理するためにネイティブの JavaScript Date オブジェクト を利用することがよくあります。ただし、このアプローチでは、Node.js と Chrome などのブラウザー コンソールなど、環境間で不整合が生じる可能性があります。この記事では、日付とタイムゾーンの変換を適切に処理することがなぜ重要なのか、Luxon がこのプロセスをどのように簡単にするのか、ネイティブ JavaScript の Date オブジェクトに依存すると不整合が生じる理由を探ります。

問題: UTC ストレージとローカル時間フィルタリング

日付が UTC で保存される場合、日付はタイムゾーンによって生じる曖昧さを排除する世界標準を表します。ただし、ユーザーは通常、ローカル タイムゾーン を基準に考えます。この不一致は、ユーザーが現地時間の入力を使用して日付でレコードをフィルタリングしようとすると明らかになります。

ユーザーの現地時間入力が適切に処理されなかった場合、レコードが失われる可能性がある例を見てみましょう。

シナリオ例: GMT-7 タイムゾーンのユーザー

GMT-7 タイムゾーン (太平洋夏時間) にいるユーザーを想像してください。 2024 年 9 月 5 日、現地時間の 午後 10 時 にレコードを作成します。舞台裏で何が起こっているかは次のとおりです:

  • 2024 年 9 月 5 日、午後 10 時 GMT-7 は、2024 年 9 月 6 日、午前 5 時 UTC に変換され、データベースにそのまま保存されます。
  • ただし、ユーザーは、このレコードを 9 月 5 日 に作成したと認識します。

フィルターの不一致

ここで、ユーザーが 9 月 5 日 に作成されたすべてのレコードをクエリしたいとします。彼らは、記録を取得することを期待して、日付2024年9月5日を入力しました。ただし、タイムゾーンの違いを調整せずに、システムが入力日付を保存された UTC 日付と直接比較すると、ユーザーは記録を見逃し になります。なぜ?

  • レコードは 9 月 6 日 (UTC) としてデータベースに保存されました。
  • ユーザーは 9 月 5 日 (現地時間) をフィルターに掛けますが、システムはこれを UTC と比較するため、一致しません。

JavaScript 日付オブジェクト: 環境間での不一致

次のコード例は、日付と時刻の変換を処理するためにネイティブ JavaScript Date オブジェクトを使用する場合、特に Node.js やブラウザー (Chrome コンソールなど) などの異なる環境間で発生する一般的な問題を示しています。

コード例:

function convertToUtcStartOfDay(isoString) {
  // Step 1: Parse the ISO string into a Date object
  let localDate = new Date(isoString);

  // Step 2: Set the time to the start of the day (00:00:00) in local time zone
  localDate.setHours(0, 0, 0, 0);

  // Step 3: Get the UTC time using toISOString() – it converts local time to UTC
  let utcStartOfDay = localDate.toISOString();

  return utcStartOfDay; // This will be in UTC
}

// Example usage:
let frontendDate = "2023-08-22T00:00:00+05:30"; // ISO string with timezone offset
let startOfDayUtc = convertToUtcStartOfDay(frontendDate);

console.log(startOfDayUtc); // Expected output: "2023-08-21T18:30:00.000Z"
ログイン後にコピー

この例では、ユーザーは日付「2023-08-22T00:00:00+05:30」(GMT+5:30 タイムゾーンから) を入力します。 Date オブジェクトは UTC での一日の始まりに変換する必要がありますが、実行時は次のようになります。

  • Node.js では、出力は 2023-08-21T00:00:00.000Z - 間違っています
  • Chrome のコンソールでは、出力は 2023-08-21T18:30:00.000Z - 正しい

この矛盾により、コードが実行される場所によっては予期しない結果が生じる可能性があります。この動作により、Date オブジェクトの信頼性が低下し、異なる環境間で一貫した日付を処理できなくなります。

Luxon を使用した正確な日付処理

この問題を解決するには、環境間で一貫した動作を提供する Luxon のようなライブラリを使用することが重要です。 Luxon は、ユーザーのローカル入力をタイムゾーンでのその日の適切な開始終了に変換し、データベース クエリを正確に行うためにそれらの時間を UTC に変換するのに役立ちます。

これを処理するために Luxon を使用する例を次に示します。

const { DateTime } = require('luxon');

// Example user input date in ISO string with timezone information from the frontend
const userInputDate = "2023-08-22T00:00:00+05:30"; // ISO string sent by frontend

// Step 1: Parse the ISO string to get the user's local time
const userLocalDate = DateTime.fromISO(userInputDate);

// Step 2: Convert this date to start of the day and end of the day in the user's local timezone
const startOfDayLocal = userLocalDate.startOf('day'); // start of the day in the user's timezone
const endOfDayLocal = userLocalDate.endOf('day'); // end of the day in the user's timezone

// Step 3: Convert these local start and end times to UTC
const startOfDayUtc = startOfDayLocal.toUTC().toJSDate(); // start of the day in UTC
const endOfDayUtc = endOfDayLocal.toUTC().toJSDate(); // end of the day in UTC

// Step 4: Query the database using the UTC range
db.records.find({
  createdAt: {
    $gte: startOfDayUtc,
    $lte: endOfDayUtc
  }
});
ログイン後にコピー

Luxon が JavaScript 日付オブジェクトより優れている理由

ネイティブの JavaScript Date オブジェクト を使用して日付とタイムゾーンの変換を直接処理すると、上記のような不一致が発生する可能性があります。 Luxon がより良い代替手段である理由は次のとおりです:

  1. Cohérence entre les environnements : Luxon fournit un comportement cohérent, que le code soit exécuté dans Node.js ou dans le navigateur (par exemple, la console Chrome). Cela élimine les divergences résultant de l'utilisation de l'objet Date dans différents environnements.

  2. Prise en charge intégrée du fuseau horaire : Luxon facilite la conversion entre les fuseaux horaires, tandis que l'objet Date n'offre pas de prise en charge robuste pour la manipulation du fuseau horaire.

  3. Manipulation simple de la date : définir le début ou la fin d'une journée dans le fuseau horaire local de l'utilisateur et le convertir en UTC est une tâche courante dans les applications mondiales. Luxon simplifie ce processus grâce à son API intuitive, tandis que Date nécessite une manipulation manuelle complexe.

Conclusion

Gérer correctement les conversions de date et de fuseau horaire est crucial pour créer des applications fiables et conviviales. Si les développeurs ne tiennent pas compte des différences de fuseau horaire lors du filtrage des enregistrements, les utilisateurs risquent de manquer des données importantes, ce qui entraîne une confusion et des erreurs potentiellement critiques.

L'utilisation de Luxon au lieu de l'objet JavaScript Date natif offre une cohérence, une meilleure gestion des fuseaux horaires et une manipulation plus facile des dates. Cela permet aux développeurs de créer une expérience transparente pour les utilisateurs sur tous les fuseaux horaires, garantissant que les requêtes fonctionnent comme prévu et qu'aucun enregistrement n'est manqué lors du filtrage.

Dans les applications mondiales, une gestion précise et fiable des dates est essentielle pour offrir une expérience de haute qualité aux utilisateurs, quel que soit leur fuseau horaire.

Pensées finales

Avez-vous déjà rencontré une situation similaire dans laquelle la gestion de la date et du fuseau horaire provoquait des résultats inattendus dans votre application ? Comment l’avez-vous abordé ? J’aimerais connaître vos expériences, vos commentaires ou toute question ou préoccupation que vous pourriez avoir. N'hésitez pas à les partager dans la section commentaires ci-dessous. Si vous avez trouvé cet article utile, aimez-le et partagez-le avec d'autres personnes qui pourraient en bénéficier !

以上が日付とタイムゾーンの変換の処理: 適切な UTC 変換が重要な理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!