большой вопрос по javascript - PullRequest
0 голосов
/ 26 января 2011

У меня есть следующий фрагмент кода, чтобы вычислить, как далеко в будущем лежит день

    var totalPixels = this._endX - this._startX;
    var segmentPixels = this._nowX - this._startX;
    var startTime = this._nowDate.getTime() - Timeline._minToMs((segmentPixels/totalPixels*this._rangeInMinutes));
    //console.log(this._nowDate.getTime() + '\n' + Timeline._minToMs(segmentPixels/totalPixels*this._rangeInMinutes));
    this._startDate.setTime(startTime);
    console.log(this._rangeInMinutes + ', ' + this._startDate.toString());

Типичные значения

endX: 1037

startX: 40

сейчасX: 134,625

rangeInMinutes варьируется от 1 до количества минут в году.

minToMs просто умножает ввод на 60 * 1000.

Мой результат отличается от моего ожидаемого результата примерно в десять раз. Возникает ли ошибка округления или происходит какое-либо усечение в процессе преобразования минут в миллисекунды?

P.S .: Что я пытаюсь сделать, так это http://jsfiddle.net/NRx9m/21/

Ответы [ 2 ]

1 голос
/ 27 января 2011

Я предполагаю, что вы выводите startTime, и я предполагаю, что _nowDate соответствует ожидаемой дате.

Итак, Timeline._minToMs((segmentPixels/totalPixels*this._rangeInMinutes)); должен быть вашим приблизительным годом, который вы ожидаете начать с этого момента?

Эта цифра будет меняться в зависимости от rangeInMinutes.Из цифр, которые вы указали, вычитаемое значение равно 0.0879*_rangeInMinutes, а затем преобразовано в мс.

Если вы получаете значение за месяц до этого, я предполагаю, что ваше значение rangeInMinutes составляет приблизительно500 000.

При заданном значении в 500 000 вы выйдете примерно за 30,5 дней.

Не могли бы вы описать математику, которую вы используете, чтобы объяснить, почему вы считаете, что ваши результаты должныбыть годом ранее (очевидно, без изменений в переменной rangeInMinutes).

В качестве альтернативы может также помочь слух о том, что такое ваш rangeInMinutes ...

Редактировать:

ОК.Глядя на код в скрипке, немного поиграем и посмотрим, на что он способен. Я думаю, что он делает то, что, как я думаю, я ожидал бы ...

Глядя на основные моменты этого следующим образом:

Я предполагаю, что startX, endX и nowX представляют позицию пикселя на временной шкале.

// number of pixels representing the range from 
var totalPixels = endX - startX; startdate to enddate
// Number of pixels representing the range from startdate to nowdate
var segmentPixels = nowX - startX;

Следующее я немного переставил, чтобы я мог пометить его более интуитивно (я надеюсь)

var startTime = nowTime 
    - Math.floor(
        (rangeInMilliseconds / totalPixels) //time per pixel
        * segmentPixels // pixels between now and start
        );

Вы также можете работать в endTime, если хотите:

var endTime = nowTime 
    + Math.floor(
        (rangeInMilliseconds / totalPixels) //time per pixel
        * (endX-nowX) // pixels between now and start
        );

Вот скрипка, которую я сделал - http://jsfiddle.net/MWCbW/

Как вы можете видетьдата начала декабря и дата окончания ноября.Причина не точного года в том, что ваш год длится 48 недель из-за того, как вы отработали второе место в году (или месяц, точнее).

Поэтому я считаю, что разница в годутам.Просто вы, возможно, не следите за тем, где он находится точно… Очевидно, вам нужно использовать шкалу 100, чтобы получить этот результат, так как в противном случае наш диапазон дат будет чем-то меньше года.

0 голосов
/ 27 января 2011

Опубликовать рабочий пример для Джошуа. Я не вижу, в чем может быть проблема, кроме десятичной точки в nowX

<script>
var x = new Object();
x._minToMs=function(min){  return min*60000; }
x._endX = 1037;
x._startX = 40
x._nowX = 134625; // WITHOUT the decimal point, this gives months instead of weeks
var totalPixels = x._endX - x._startX;
segmentPixels = x._nowX - x._startX;
x._nowDate=new Date();
x._startDate=new Date();
x._rangeInMinutes = 1000;
var startTime = parseInt(x._nowDate.getTime() - x._minToMs((segmentPixels/totalPixels*x._rangeInMinutes)));
x._startDate.setTime(startTime);
alert(x._rangeInMinutes + ', ' + x._startDate.toString());

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...