0

これは私がこれまでjqueryを使用してきたものです。私の checkRecord ボタンが 2 つの日付の間の日数を表示しない理由がわかりません。私は明らかに何かが欠けています。

$(document).ready(function () {
'use strict';      
var monthNames = [ "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" ];
var dayNames= ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]

var newDate = new Date();
 newDate.setDate(newDate.getDate()); 

$('#safetyRecord').hide();

$('#today').html(dayNames[newDate.getDay()] + "," +' ' + monthNames[newDate.getMonth()] + ' ' + newDate.getDate() + ","+ ' ' + newDate.getFullYear());

$('#checkRecord').click(function(){
var $daysSinceLastAccident = $('#daysSinceLastAccident');

var dateOfLastAccident = new Date($('#dateOfLastAccident').val());

var today = new Date();

$daysSinceLastAccident = Math.floor((today.getTime() - dateOfLastAccident.getTime()) / (24 * 60 * 60 * 1000));

$daysSinceLastAccident.text(daysSinceLastAccident);
$('#safetyRecord').show();
});

});
4

3 に答える 3

0

あなたのコードで:

>  newDate.setDate(newDate.getDate()); 

newDateの日付を現在の値に設定するだけです。

> var $daysSinceLastAccident = $('#daysSinceLastAccident');
> [...] 
> $daysSinceLastAccident = Math.floor((today.getTime() - ...

最初に $daysSinceLastAccidentに jQuery オブジェクトへの参照が割り当てられ、次に数値が割り当てられます。最初の割り当ての目的は何ですか?

> $daysSinceLastAccident.text(daysSinceLastAccident);

しかし、あなたはそれがまだ jQuery オブジェクトであることを期待しているようです。

また:

> var today = new Date();

現在の日付を表示するために使用された、おそらく 1 ミリ秒前のまったく同じ値を持つ可能性が高いnewDate変数が既に存在します。二度と使わない理由はないようです。

2 つの日付オブジェクトの差を日数で求める場合は、関連する日付の時刻を正午に設定し、ミリ秒/日で減算および除算して丸めることができます。

上記の例:

var newDate = new Date();
newDate.setHours(12,0,0,0); // 12:00:00.000

// You should never leave parsing of date strings to the Date object
// I'll assume here that it "works" in the limited cases you've tested
var dateOfLastAccident = new Date($('#dateOfLastAccident').val());
dateOfLastAccident.setHours(12,0,0,0);

var daysSinceLastAccident = Math.round((newDate - dateOfLastAccident) / 8.64e7);

日付文字列を手動で解析する必要がありますが、難しいことではありません。たとえば、2013-10-09 のような入力を指定すると、次のことができます。

function parseISODateString(s) {
  s = s.split(/\D/g);
  var d = new Date(s[0], --s[1], s[2]);

  // Return d if s was a valid date string, NaN otherwise.
  return (d && d.getFullYear() == s[0] && d.getDate() == s[2])? d : NaN;
}

入力文字列と戻り値をテストして、堅牢にする必要があります。

于 2013-10-08T22:56:50.457 に答える