0

私は JavaScript、JSON、および date.js を使用しており、JSON ファイルを解析して、現時点で行われているクラスのリストのみを表示しようとしています。JSON ファイルを解析できたので、現在の日に行われるクラスのみが表示されます。ただし、時間を正しく解析できませんでした。

私のJSONファイルの一部:

[
{
    "day": "Monday",
    "activities": [
        {
            "activity": "Freestyle ",
            "times": [
                {"start":"6:30 AM","end":"7:15 AM"},
                {"start":"7:15 AM","end":"8:15 AM"},
                {"start":"5:15 PM","end":"6:00 PM"}
            ]
        },
        {
            "activity": "Open Skate ",
            "times": [
                {"start":"11:30 AM","end":"5:00 PM"},
                {"start":"7:30 PM","end":"9:30 PM"}
            ]
        },
        {
            "activity": "Holiday Snowbunnies 1 ",
            "times": [
                {"start":"6:00 PM","end":"6:30 PM"}
            ]
        }
    ]
},
{
    "day": "Tuesday",
    "activities": [
        {
            "activity": "Freestyle ",
            "times": [
                {"start":"5:45 AM","end":"6:30 AM"},
                {"start":"6:30 AM","end":"7:15 AM"},
                {"start":"6:45 PM","end":"7:30 PM"}
            ]
        },
        {
            "activity": "Open Skate ",
            "times": [
                {"start":"10:00 AM","end":"5:00 PM"},
                {"start":"7:30 PM","end":"9:30 PM"}
            ]
        },
        {
            "activity": "Patch ",
            "times": [
                {"start":"10:00 AM","end":"10:30 AM"}
            ]
        }
    ]
}
]

私の JavaScript - 適切な機能:

function updateSchedule(responseText){
var activitiesDiv = document.getElementById("activities");
var skActivities = JSON.parse(responseText);
var toDay = Date.today().getDayName();
var now = new Date();
var curHour = now.toTimeString('hh:mm tt');

for(var i=0;i<skActivities.length;i++){
    var activityDay = skActivities[i];
    if(activityDay.day == toDay)
    {   
        var toDaysActivities = activityDay.activities;
        for(var j=0;j<toDaysActivities.length;j++){
            var toDayActivity = toDaysActivities[j];

            var curTimeDayActivities = toDayActivity.times;
            for(var k=0;k<curTimeDayActivities.length;k++){
                var curTimeDayStartActivity = curTimeDayActivities[k].start;

                if(curTimeDayStartActivity >= curHour){
                    var div = document.createElement("div");
                    div.innerHTML = toDayActivity.activity + ": " + curTimeDayActivities[k].start;
                    activitiesDiv.appendChild(div);
                }
            }
        }
    }
    continue;
  }
}

現在、関数は現在の曜日に行われるすべてのクラスとその時間を返します。: 例外は「11:30 AM オープン スケート」です。返される値は 9 以下のものだけのようです。

繰り返しますが、私の意図は、ユーザーがサイトにアクセスして、現在行われているクラスを確認することです。

: date.js を利用するためのソリューションが必要ない場合は、それで問題ありません。取り入れようと思っただけです。

任意の推奨事項をいただければ幸いです。

4

1 に答える 1

1

日付ライブラリはここではあまり役に立たないと思います。肥大化やその他の維持と心配が追加されるだけです。以下は「現在の」アクティビティを取得します。返されたデータをフォーマットして何かを行うのはあなた次第です。

日付のサポートはあまり必要ありません。主にアクティビティをフィルタリングしています。比較のために時刻を日付オブジェクトに変換するのは簡単です (3 行のコード)。

var dUtil = {

  // Use provided date object, or today
  // Add support for strings?
  getDayName: function(dateObj) {
    var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    dateObj = dateObj || new Date();
    return days[dateObj.getDay()];
  },


  // Expects a string like '10:00 AM', assumes current date
  // Note that this will only work where client and server are
  // the same timezone
  timeToDate: function(s) {
    var d = new Date();
    s = s.split(/[: ]/);
    d.setHours((s[2] == 'AM'? s[0] : +s[0] + 12), s[1], 0);
    return d; 
  }
};


function getCurrentActivities(data) {

  var currentActivities = [];
  var todayActivities, activity, name, times, start, end;
  var now = new Date();

  // Get current day name
  var currentDayName = dUtil.getDayName();

  // Get activities from array
  for (var i=0, iLen=data.length; i<iLen; i++) {
    if (data[i].day == currentDayName) {
      todayActivities = data[i].activities;
      break;
    }
  }

  // If there are no activities for today, return undefined
  if (!todayActivities) return;

  // For each activity today, see what are on now
  for (var j=0, jLen=todayActivities.length; j<jLen; j++) {
    activity = todayActivities[j];
    name = activity.activity;

    // Loop over times to see if on now
    times = activity.times;
    for (var k=0, kLen=times.length; k<kLen; k++) {

      if (dUtil.timeToDate(times[k].start) < now && 
          dUtil.timeToDate(times[k].end) > now) {

        // Add activity to result array
        // Format to whatever is needed
        // This gives an array of strings like "Freestyle  - 6:45 PM to 7:30 PM"
        currentActivities.push(name + ' - ' + times[k].start + ' to ' + times[k].end);
      }
    }
  }
  return currentActivities;
}
于 2012-12-06T05:32:47.070 に答える