3

私はjavascriptDate()関数の奇妙な問題に取り組んでいます。これらは詳細です

サーバー側 : Struts (ActionForm、Action クラス、jsp)
クライアント側 : jQuery、javascript

ここで、ページにサーバー時間が必要であり、javascript を使用して操作します。そこで、 Calendar.getInstance().getTimeinMillis();アクション クラスで実行し、それを ActionForm 属性として保存しました。

クライアント側で、styleId から long 値 (timeinMillis) を取得しました。しかし、操作するために、私がするとき

var curTime = parseInt($("#serverTime").val());
var serverTime = new Date(curTime);

現在、serverTime は、サーバーの timeinMillis を提供していますが、サーバーの日付ではなく、クライアント マシンの日付を提供しています。

奇妙な部分は、サーバーから long timeinMillis の代わりに日付の文字列値を渡し、それを引数として渡すと、うまく機能します。

何か案が?

4

4 に答える 4

5

これは、javascript がクライアント マシンで実行されるためです。そのため、javascript で new Date() を作成すると、クライアント マシンの時刻が取得されます。

サーバーの日付を文字列として渡すと、2 番目のクエリに応答し、その日付の日付オブジェクトが作成されます。

以下の関数を使用

    function calcTime(offset) {
        // create Date object for current location
        d = new Date();
       // convert to msec, add local time zone offsetand  get UTC time in msec
        utc = d.getTime() + (d.getTimezoneOffset() * 60000);

        // create new Date object with supplied offset
        nd = new Date(utc + (3600000*offset));

        // return time as a string
        return "The Server time is " + nd.toLocaleString();

    }

ここでは、サーバー時間のオフセットを UTC で渡す必要があります

于 2012-07-04T12:19:37.457 に答える
3

最後に、上記のヒントの助けを借りて問題を解決しました。

Java 側から、夏時間オプションを使用して UTC からのオフセットを取得しました。

だから、アクションクラスで

Calendar c = Calendar.getInstance();
TimeZone z = c.getTimeZone();
int offset = z.getOffset(c.getTimeInMillis());

これにより、ローカル タイムゾーンと夏時間を含む UTC タイムゾーンのオフセットが得られます。

JavaScriptで、私が使用した、

var now = new Date(); 
var now_utc = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
var sd = new Date(now_utc.getTime() + offset);
alert("The Server time is " + sd.toLocaleString());

そして、これにより、夏時間オプションを使用して正しいサーバー時刻が得られます。

彼らなしでは、それを解決することは不可能だったでしょう。乾杯!

于 2012-07-05T06:40:44.097 に答える
2

PHP での簡単な解決策:

  var phpDate = '<?php echo date('Y/m/d H:m:s');?>'
    , serverDate = new Date(phpDate)
    , month = serverDate.getMonth()+1 //getMonth() returns a 0-based number.
    , day = serverDate.getDate()
    , year = serverDate.getFullYear();

  console.log(year + '-' + month + '-' + day);
于 2014-07-01T17:20:33.150 に答える
1

サーバーとクライアントの時刻が異なるタイムゾーンにあり、この違いをユーザーに表示する場合は、タイムゾーン情報もクライアントに送信する必要があります。

Calendar.getInstance().getTimeinMillis()エポックからのミリ秒数を返しますが、タイムゾーンについては何も言いません。1970/1/1 UTCの午前0時からのミリ秒数であり、システムのタイムゾーンに関係なく、この数値はどのシステムでも同じです(時刻が同期されている場合)。これにより、サーバーではなくクライアントの時間を取得しているように見える場合があります。

Dateこれが日付の文字列表現で機能する理由は、それに含まれるタイムゾーン情報と、オブジェクトを構築するときにそれを解析して考慮に入れるJavascriptの機能です。

于 2012-07-04T12:16:43.840 に答える