メインコンテンツまでスキップ

タイムゾーン

Reveal SDK はデフォルトで、今日や今月などの相対日付フィルター、日付ピッカー、および currentTimeZone() 関数にブラウザーのタイムゾーンを使用します。別のタイムゾーンでダッシュボードを表示するには (たとえば、ノート PC がロンドンに設定されているニューヨーク勤務のユーザー向け)、RevealSdkSettings.timeZone を設定します。Reveal はそのタイムゾーンを使用し、データ ソースから読み取るすべての DateTime フィールド (計算フィールドを除く) をそのタイムゾーンに変換します。

Reveal にはタイムゾーン ピッカーは含まれていません。言語と同様に、UI はアプリケーションが提供します。

備考

タイムゾーン API は Reveal SDK 2.3.0 以降で使用できます。

タイムゾーンの設定​

RevealSdkSettings.timeZone に次のいずれかの値を設定します。

値相対日付フィルター、日付ピッカー、currentTimeZone() が使用するタイムゾーンDateTime 値
null (デフォルト)ブラウザーのタイムゾーン変換なし (保存されている値のまま表示)
RVTimeZone.Browserブラウザーのタイムゾーンブラウザーのタイムゾーンに変換
RVTimeZone のメンバーまたは IANA 名指定したタイムゾーン指定したタイムゾーンに変換

null と RVTimeZone.Browser の違いは変換の有無だけです。2024-01-31 23:30 として保存されている値は、null では 23:30 と表示され、ブラウザーがニューヨークに設定されている場合、RVTimeZone.Browser では 18:30 と表示されます。DateTime 値をユーザー自身のタイムゾーンで表示するには、RVTimeZone.Browser を使用します。

// Use New York time instead of the browser's
RevealSdkSettings.timeZone = RVTimeZone.AmericaNewYork;

// Any IANA time zone name works too
RevealSdkSettings.timeZone = "Europe/Madrid";

// Go back to the default: the browser's time zone, with no conversion
RevealSdkSettings.timeZone = null;

RevealView を作成する前に設定することも、ダッシュボードを開いている間にいつでも設定することもできます (開いているダッシュボードでのタイムゾーンの切り替えを参照してください)。タイムゾーンはグローバルな設定です。ページ上のすべての RevealView が同じタイムゾーンを使用します。使用中のタイムゾーンを取得するには、RevealSdkSettings.getCurrentTimeZone() を呼び出します。

クライアントがすべてのデータ リクエストとともにタイムゾーンを送信するため、サーバー SDK (ASP.NET、Java、Node.js) ではタイムゾーン用のコードは必要ありません。独自のタイムゾーンを指定するのはサーバー側のエクスポートのみです。

タイムゾーン リストの作成​

RVTimeZone には、よく使用される 139 のタイムゾーン (UTC オフセットと夏時間ルールの組み合わせごとに 1 つ) と Browser が含まれています。すべてのメンバーは、ブラウザーとサーバーの両方で受け入れられる IANA 名です。Etc/GMT のメンバーは、IANA の定義どおり符号が反転した固定オフセットです。たとえば、Etc/GMT+8 は UTC−8 を表します。このトピックの最後にある例では、これらのメンバーをセレクターに追加します。

ブラウザーが認識するすべてのタイムゾーンを選択肢として提供するには、代わりに Intl.supportedValuesOf("timeZone") を使用します。

無効なタイムゾーン名の処理​

Reveal が認識できない名前を設定するとエラーがスローされ、以前のタイムゾーンが引き続き使用されます。名前をユーザー入力や保存された設定から取得する場合は、代入を try ブロックで囲みます。

try {
RevealSdkSettings.timeZone = userInput;
} catch (e) {
showError(e.message); // "Invalid time zone: ..."
}

例では、保存された名前が無効になっている場合、セレクターの横にエラーが表示されます。

IANA 名のみを使用してください。Pacific Standard Time などの Windows のタイムゾーン名は拒否されます。+05:30 などのオフセット文字列は一部のブラウザーでは受け入れられますが、サーバーでは解決できないため、DateTime フィールドを含むすべての表示形式が「Unknown time zone」エラーで失敗します。固定オフセットを使用する場合は、対応する Etc/GMT のメンバー、またはそのタイムゾーンに属する都市 (UTC+5:30 の場合は Asia/Kolkata など) を使用します。

開いているダッシュボードでのタイムゾーンの切り替え​

ダッシュボードの表示中に RevealSdkSettings.timeZone を設定すると、そのデータがその場で再読み込みされます。ダッシュボードは再構築されないため、ユーザーの次の状態は維持されます。

  • フィルターの選択
  • 最大化された表示形式
  • ドリルダウンのレベルとスクロール位置

相対日付フィルターは新しいタイムゾーンに合わせて移動し (今日はそのタイムゾーンでの今日になります)、開いているポップアップは閉じます。すでに使用中の値を設定した場合は、何も再読み込みされません。

次の例では、Asia/Tokyo に切り替える前に Region フィルターを Americas に設定しています。フィルターは維持され、注文時刻のみが変わります。

DateTime 値の変換方法​

タイムゾーンが設定されている間、サーバーはデータ ソースから読み取るすべての DateTime フィールド (計算フィールドを除く) をそのタイムゾーンに変換します。変換はグループ化、フィルタリング、書式設定の前、および計算フィールドの評価前に行われるため、計算フィールドは変換後の値を読み取ります。ダッシュボードやデータ ソースを変更する必要はありません。

変換は UTC を起点に行われます。Reveal 全体と同様に、タイムゾーンを持たない DateTime 値は UTC として扱われ、SQL Server の datetimeoffset や Oracle の TIMESTAMP WITH TIME ZONE など、独自のオフセットを持つ値は UTC に正規化されます。

  • 変換されるのは DateTime フィールドのみです。 同じ行の DateTime が別の日に移動した場合でも、Date フィールドと Time フィールドがずれることはありません。
  • グループ化はタイムゾーンに従います。 日、週、月によるグループ化には変換後の値が使用されます。
  • 計算フィールドは変換されません。 計算フィールドが読み取るフィールドはすでに変換済みのため、再度変換されることはありません。applyTimeZone() を呼び出す数式は、値をもう一度変換します (既存のダッシュボードのアップグレードを参照してください)。
  • カスタム表示形式には変換後の値が渡されます。 カスタム表示形式に渡されるデータは、すでに使用中のタイムゾーンに変換されています。

たとえば、2024-01-31 23:30 として保存されている OrderDate DateTime フィールドと、2024-02-02 として保存されている ShipDate Date フィールドを持つ注文の場合:

RevealSdkSettings.timeZoneOrderDate (DateTime)ShipDate (Date)
null2024-01-31 23:302024-02-02
RVTimeZone.AmericaNewYork2024-01-31 18:302024-02-02
RVTimeZone.AsiaTokyo2024-02-01 08:302024-02-02

以下のダッシュボードには、1 月 31 日から 2 月 1 日にかけて、UTC の午前 0 時前後に発生した 12 件の注文が含まれています。タイムゾーンを設定しない場合、Sales by Day は注文を 2 日に分けてグループ化します。

RVTimeZone.AsiaTokyo を設定すると、すべての OrderDate が 9 時間進むため、同じ注文が 3 日に分かれます。ShipDate は変わりません。

サポートされるデータ ソース​

タイムゾーンの変換は、データ ソース別の機能サポートに記載されているデータ ソースでのみ動作します。タイムゾーンが設定されている間、DateTime フィールドを含む表示形式が、その他のデータ ソースを使用している場合、その他のデータ ソースをブレンドしている場合、または入れ替えたデータを使用している場合は、「Converting to the current time zone requires Engine2…」というエラーが表示されます。これらのダッシュボードでは、RevealSdkSettings.timeZone を null のままにしてください。

エクスポート​

RevealView から開始したエクスポートには、ユーザーに表示されている値が、使用中のタイムゾーンで含まれます。

サーバー側のエクスポートにはブラウザーがないため、エクスポート オプションの TimeZone プロパティを使用します。このプロパティが設定されている場合、DateTime 値はそのタイムゾーンに変換され、相対日付フィルターと currentTimeZone() もそのタイムゾーンを使用します。設定されていない場合、エクスポートは UTC を使用し、値は変換されません。

var pdfOptions = new PdfExportOptions()
{
TimeZone = "America/New_York"
};

var stream = await dashboardExporter.ExportToPdf(dashboardName, options: pdfOptions);

同じプロパティは、Excel、PowerPoint、画像、CSV のすべてのエクスポート オプション クラスで使用できます。ユーザーがアプリケーションで選択したタイムゾーンでエクスポートするには、エクスポート リクエストとともにその選択をサーバーに送信します。

既存のダッシュボードのアップグレード​

applyTimeZone([OrderDate], currentTimeZone()) や applyTimeZone([OrderDate], "Europe/Madrid") など、手動で変換を行っていた applyTimeZone() 数式を削除し、[OrderDate] を直接使用してください。タイムゾーンが設定されている間は OrderDate がすでに変換されているため、これらの数式によって値が 2 回変換されます。RevealSdkSettings.timeZone が null の間は、ダッシュボードは従来どおり動作します。

例: ユーザーによるタイムゾーンの選択​

この例では、ダッシュボードの横にタイムゾーン セレクターを追加し、使用中のタイムゾーンを表示して、ユーザーの選択を記憶し、フィルターを失うことなく開いているダッシュボードのタイムゾーンを切り替えます。

手順 1 - セレクター、使用中のタイムゾーンを表示するラベル、およびエラーを表示する場所を追加します。

<select id="timeZone">
<option value="">Browser time zone (no conversion)</option>
<option value="Browser">Browser time zone (convert dates)</option>
</select>
<span id="currentTimeZone"></span>
<span id="timeZoneError" style="color: red"></span>
<div id="revealView" style="height: 800px; width: 100%;"></div>

手順 2 - セレクターに項目を追加し、ダッシュボードを読み込む前に保存された選択を適用して、変更時にタイムゾーンを切り替えます。

const select = document.getElementById("timeZone");
const current = document.getElementById("currentTimeZone");
const error = document.getElementById("timeZoneError");

for (const zone of Object.values(RVTimeZone)) {
if (zone !== RVTimeZone.Browser) {
select.add(new Option(zone.replace(/_/g, " "), zone));
}
}

// Sets the time zone; returns false and keeps the previous one when the name is invalid
function setTimeZone(zone) {
let applied = true;
try {
RevealSdkSettings.timeZone = zone || null;
error.textContent = "";
select.value = zone || "";
} catch (e) {
error.textContent = e.message;
applied = false;
}
current.textContent = `Times shown in ${RevealSdkSettings.getCurrentTimeZone()}`;
return applied;
}

select.addEventListener("change", () => {
// An open dashboard reloads by itself, keeping its filters
if (setTimeZone(select.value)) {
localStorage.setItem("timeZone", select.value);
}
});

// Apply the saved choice before creating the RevealView
setTimeZone(localStorage.getItem("timeZone") ?? "");

RevealSdkSettings.setBaseUrl("https://localhost:5111/");
RVDashboard.loadDashboard("Sales").then(dashboard => {
const revealView = new RevealView("#revealView");
revealView.dashboard = dashboard;
});

デバイス間で選択を引き継ぐには、localStorage の代わりにアプリケーションのユーザー プロファイルに保存し、RevealView を作成する前にそこから読み取ります。