4

私はjquery libを書いています.Datetime関数を実装する必要があります. 新しい Date オブジェクトを返す .Date() 関数を作成する必要があります。

新しい日付オブジェクトを作成するために、.Date(args) 関数の引数を Date オブジェクト コンストラクターに渡す方法は?

私はこのようなことを試しました。私はプラグインの名前空間、me=$.jqGUI です。

        //.Date(Value)
        /* Return a date object.
         * ReturnValue = Date(Value)
         */
        me.Date = function(Value){
            //pass arguments to Date constructor
            var sDate = Date.prototype.constructor.apply(null, arguments);

            console.log(sDate);

            //create a date object d
            var d = new Date(sDate);

            //validate date object
            if(d.toDateString()=="Invalid Date"){
                throw new Error("$.jqGUI.Date: Invalid Date");
            }
            else{
                return d;                   
            }
        };

ここで Date.prototype.constructor に引数を渡しますが、いずれにしても現在の日付を取得します。引数が日付文字列の場合、無視されます。なぜ?

4

5 に答える 5

8
var args = Array.prototype.concat.apply([null], arguments);
return new (Function.prototype.bind.apply(Date, args));

ターゲット ブラウザが ECMAScript 5 Function.prototype.bind をサポートしていない場合、コードは機能しません。ただし、互換性テーブルを参照してください。

于 2013-08-14T19:05:37.830 に答える
2
Date.prototype.constructor

はまったく役に立ちません。ただ使用Dateしてください。関数コンストラクターです。

.apply(null, ...

ではなく、そのタイプの新しく作成されたオブジェクトにコンストラクターを適用する必要がありますnull「new」演算子での .apply() の使用を参照してください。これは可能ですか?

ただし、実際のDateコンストラクター ( に使用される関数new) を適用することはできません。これは、EcmaScriptDateが関数として呼び出されたときに現在の UTC 時刻を返さなければならないことを指定しているためです。


とにかく、これは必要ありません。一連の (可変サイズの) 引数を受け取る代わりに、パラメーターをDateオブジェクトとして指定する必要があります。関数のユーザーは、自分が望む方法でそれを構築できます。

Dateあなたの奇妙に見える関数は、コンストラクターとまったく同じように見えます。それを捨てて、ユーザーにDate自分で適用させてください - 彼は自分が望むフォーマットを知っています.

また、 を使用しないでくださいif(d.toDateString()=="Invalid Date")。これは標準化されていませんが、実装に依存します。有効なDateオブジェクトを確認するには、単に使用しますisNaN- 解析不能な日付の内部表現 (Dateインスタンスの値) は ですNaN

提案:

me.date = function(d) {
/* gets: a Date object or something that can be transformed to a Date
returns: a valid Date object, else throws an Error */

    d = new Date(d); // works also for Date instances, uncouples them
                     // else creates new one from string or number
    if (isNaN(d))
        throw new Error("$.jqGUI.Date: Invalid Date");
    return d;
};
于 2012-07-10T07:48:09.333 に答える
0

いくつかのメモ:

  • eval危険ですので絶対に使用しないでください。
  • bind常に利用できるわけではなく、指摘されているように、シムは同じように機能しません。
  • Date.UTCDateまた、可変引数リストを取り、コンストラクターで使用できるスカラーを返します。
  • apply実際の配列ではなく、配列のようなオブジェクトのみが必要なので、arguments十分です。

したがって、これが私の推奨する、ブラウザーに安全な、完全に可変の方法です。で引数を処理しないことに注意してくださいDate.now()。a を渡すことnullは、引数がないことと同じではないため、同じことを実行できます。

me.Date = function(value){
    if (arguments.length < 1) value = Date.now();
    else if (arguments.length > 1) value = Date.UTC.apply(null, arguments);
    var d = new Date(value);

    // ...
}
于 2014-07-14T18:47:46.640 に答える
-1

受け入れられた答えは理想的ではありません。このスレッドを読んでいる人がさらに調査してくれることを願うばかりです。「eval」を使用すると、util-lib では望ましくないと思われる多くの副作用があります。

これがあなたができることの大まかな見方です:

function dateShimmer() {  
    if(arguments.length === 1){
        return new Date(arguments[0]);
    }
    else if(arguments.length > 1){
        return dateArgumentShimmer.apply(null, arguments);
    }
    return new Date();
}

function dateArgumentShimmer(a1, a2, a3, a4, a5, a6, a7){
    //Direct invocation is faster than apply/call
    switch(arguments.length){
    case 2:  return new Date(a1, a2);
    case 3:  return new Date(a1, a2, a3);
    case 4:  return new Date(a1, a2, a3, a4);
    case 5:  return new Date(a1, a2, a3, a4, a5);
    case 6:  return new Date(a1, a2, a3, a4, a5, a6);
    case 7:  return new Date(a1, a2, a3, a4, a5, a6, a7); 
    }
 }; 

ここのJsfiddle:http://jsfiddle.net/y7Zm/

于 2014-01-30T02:23:04.990 に答える
-2

私にとっては、次のことがうまくいきました

var args = [];
for(var i = 0; i < arguments.length; i++)
   args.push("arguments[" + i + "]");

var d = eval("new Date(" + args.join(",") + ")");   
于 2012-07-10T12:21:59.820 に答える