0

さまざまなタイム ゾーンから使用されるアプリケーションがあります。ニューヨーク (東部時間) で誰かがデータベースに入力された場合、ニューヨーク時間で入力された人物が表示されます (ほとんどのアプリケーションで行われます)。ただし、タイムゾーン外の誰かがそれを見ると、時間がそのユーザーのタイムゾーンに変換されているようです。

変換を停止するか、正しい時間に変換しようとしています。それは正しくjavascriptに渡されます。問題が見つかったのはjavascriptにあります。

オブジェクトの日付文字列は、(たとえば) "Fri Aug 21 12:30:00 PDT 2013" を示します。

この関数を変更して、米国の夏時間で動作し、中央のタイム ゾーンを使用するようにしました。フォーマットから UNIX エポックまでの日付を処理するために、この関数も使用しました。

「PDT」またはその他のタイムゾーン識別子(「CST」、「MST」、「PST」など)の場合、変換が行われない可能性があると考えていました。その「PDT」以外のタイムスタンプが必要な正しい時間ですが、2時間早く表示されると何かが起こることに注意してください。

私の主な問題は、ニューヨークで 2013 年 7 月 24 日の午後 1 時に誰かが入力された場合、そのデータを表示するときに自分がどのタイムゾーンにいるかに関係なく、依然としてそのように表示されるはずです。問題は次のとおりです。

  1. ユーザーは、2013 年 7 月 24 日の午後 3:00 にある場所 (常にニューヨークであるとは限りませんが、例としては使いやすいです) からシステムに入力されます。
  2. データベースからアプリケーションを介して JavaScript に正しく送信されます (2013 年 7 月 24 日午後 3 時)。
  3. 私が別のタイム ゾーン (中部としましょう) にいる場合、日付は JavaScript のオブジェクトに (Wed Jul 24 3:00 CDT 2013) として表示されます。<--ご覧のとおり、「CDT」のタイムゾーン識別子以外は技術的に正しいです。時間がほぼ同じなら、その識別子を削除する方法があれば、私はゴールデンだと思います。
  4. 他の関数は呼び出されず、日付は 2013 年 7 月 24 日 2:00 と表示されます。

どんな考えでも非常に役に立ちます。ここに私の変換関数があります:

function calcTime(date) {
//This is to pad the date with a zero if the
//number is less than 10. eg 7/1/2013 = 07/01/2013
function pad(num) {
    num = num.toString();
    if (num.length == 1) return "0" + num;
    return num;
}

//I needed to have my date passed in as string
//This will set the date to the string and then get the time from
//that date. It will then set that time.
var date = new Date(date);
var time = date.getTime();
date.setTime(time);

var year = date.getUTCFullYear();

//This nifty little thing will get you the daylight savings time
// and adjust correctly. In the US, prior to 2006 the DST started
//first sunday in April and ended in the last sunday in October.
//After 2007, it was changed to start on the 2nd sunday in March
//and end in the first sunday in November. If you are working
//with a different country, please follow this link for
//the equations in relation to their daylight savings time.
//http://www.webexhibits.org/daylightsaving/i.html
if (year <= 2006) {
    var start_day = (2 + ((((6 * year) - year / 4) % 7) + 1));
    var DST_start = new Date(Date.UTC(year, 3, start_day, 1, 0, 0));

    var end_day = (31 - ((((5 * year) / 4) + 1) % 7));
    var DST_end = new Date(Date.UTC(year, 9, end_day, 1, 0, 0));
}

if (year >= 2007) {
    start_day = (14 - ((1 + (year * 5) / 4) % 7));
    DST_start = new Date(Date.UTC(year, 2, start_day, 1, 0, 0));

    end_day = (7 - ((1 + (year * 5) / 4) % 7));
    DST_end = new Date(Date.UTC(year, 10, end_day, 1, 0, 0));
}

//This function is supposed to make sure no matter where you are,
//you can see this in US central time. Obviously you will need to
//change this if you need a different time zone.
//All timezones to the west of GMT to the International Date Line will be negative.
//Timezones east of GMT to the International Date Line will be positive.
//The below offset is if it is DST, it adjusts the time accordingly.
var centralOffset = -6 * 60 * 60 * 1000;
if (date > DST_start && date < DST_end) centralOffset = -5 * 60 * 60 * 1000;

date.setTime(time + centralOffset);

//This will call the pad function to return a two digit month/day format.
//Dates are zero based in JS and needed to add 1 to the UTCMonth so we receive the
//current month
var centralTime = pad(date.getUTCMonth() + 1) + "/" +
pad(date.getUTCDate()) + "/" + date.getUTCFullYear() +
" " + pad(date.getUTCHours()) + ":" +
pad(date.getUTCMinutes()) + ":" + pad(date.getUTCSeconds());

return centralTime;
};

//Test Data
var date = "7/25/2013 09:30:00";
calcTime(date);

更新: 私はあまり運がありませんでした。タイム ゾーン識別子を正常に削除できましたが、正しい日付の新しい文字列を取得して、それを新しい Date 関数に渡そうとすると、識別子が元に戻ります。以下の更新されたコードを参照してください。

function getDateTime() {
  function pad(num) {
    num = num.toString();
    if (num.length == 1) return "0" + num;
    return num;
}


var timezones = ["PST", "PDT", "MST", "MDT", "CST", "CDT", "EST", "EDT", "GMT"];

var date = this; //this = "Wed Aug 21 14:38:00 CST 2013" or whatever date is being passed in

//This converts date to string so it can remove the time zone identifier.
date = date.toDateString();

var length = timezones.length;
while (length--) {
    if (date.indexOf(timezones[length]) != -1) {
        date = date.replace(timezones[length], "");
    }
}

date = new Date(date); // This pretty much defeats all that I did above.
//date = Date(date); //This will give the current date and time.

var month = pad(date.getMonth() + 1);
var day = pad(date.getDate());
var year = date.getFullYear();
var hour = pad(date.getHours());
var minute = pad(date.getMinutes());
var second = pad(date.getSeconds());


if (hour > 12) {
    var timestring = hour.toString() + ":" + minute.toString() + ":" + second.toString() + " PM";
} else {
    timestring = hour.toString() + ":" + minute.toString() + ":" + second.toString() + " AM";
}

var output = month.toString() + "/" + day.toString() + "/" + year.toString() + " " +   timestring;

return output;

}

これにより、他の誰かが元の投稿から持っていた可能性のある混乱が解消されることを願っています.

4

1 に答える 1

1

複数の文字列置換を使用して、元の文字列を保持します。

var foo = "2013-10-01T09:00:00.000-04:00";
var bar = foo.substr(-6);
var baz = foo.substr(11,2)
var isoDate = new Date(foo).toISOString().replace("Z",bar).replace(/T../,"T"+baz);
var hours = String(baz).concat(Number(baz) < 12 ? "PM" : "AM").replace(/^0/,"")
于 2014-02-13T22:26:15.667 に答える