0

Я использую сборщик (Ti.UI.Picker) и задаю тип Ti.UI.PICKER_TYPE_TIME. Цель состоит в том, чтобы позволить пользователю изменить время записи даты в базе данных. Дата хранится в метке времени UTC. Поток идет как это:Titanium/Appcelerator - используя сборщик для времени, создает объект даты с локальной разницей времени

  1. Пользователь открывает контроллер
  2. дата извлекается из БД, и хранится в виде объекта Момент даты JS, с использованием метода moment.utc().
  3. Пользователь выбирает, чтобы открыть окно выбора для изменения времени
  4. Метод moment.toDate() используется для передачи требуемого объекта даты в селекторе
  5. Початкоотделитель открывается со временем, которое было исправлено в соответствии с настройкой часового пояса на их телефон например: +1 час.
  6. Когда пользователь выполнен, сборщик возвращает объект даты, и результирующее время не является тем, что они выбрали; в этом случае это -1 час.

Я думал, что используя moment.utc(), я смог бы избежать этого. Но, возможно, сборщик делает некоторые внутренние вещи с обычным объектом даты JavaScript, тем самым получая эту корректировку во времени.

Есть ли способ обойти это? Моя цель в том, что; если первоначальное время составляет 13:00, я хочу, чтобы сборщик был открыт с 13:00, а затем, если пользователь изменит его на 15:00, я хочу, чтобы результат от сборщика составлял 15:00, а соответствующий ярлык отображался как 15:00.

Вот некоторые примеры кода

var moment = require('alloy/moment'); 

var time_unix = 1396815002000; 
var date_obj = moment.utc(time_unix); 

function updateTimeLabel() { 
    $.timeLabel.setText(date_obj.format('HH:mm')); 
} 

function onTimeClick() { 
    var pickerView = Titanium.UI.createView({ 
     backgroundColor: "#FFF", 
     height: 280, 
     bottom :-280, 
     zIndex: 1000 
    }); 
    var cancel = Ti.UI.createButton({ 
     title:'Cancel', 
     style: Ti.UI.iPhone.SystemButtonStyle.BORDERED 
    }); 
    var done = Ti.UI.createButton({ 
     title:'Done', 
     style: Ti.UI.iPhone.SystemButtonStyle.DONE 
    });  
    var spacer = Ti.UI.createButton({ 
     systemButton: Ti.UI.iPhone.SystemButton.FLEXIBLE_SPACE 
    }); 
    var toolbar = Ti.UI.iOS.createToolbar({ 
     top: 0, 
     barColor: '#000', 
     items:[cancel,spacer,done] 
    }); 
    var picker = Ti.UI.createPicker({ 
     type: Ti.UI.PICKER_TYPE_TIME, 
     value: date_obj.toDate(), // does the problem occur here? 
     minDate: new Date('1950-01-01'), 
     maxDate: new Date('2050-01-01'), 
     top: 45 
    }); 
    cancel.addEventListener('click', function() { 
     console.log('cancel pressed'); 
     pickerView.animate({bottom: 0, duration: 500}); 
    }); 
    done.addEventListener('click', function (evt) { 
     date_obj = moment.utc(picker.getValue()); 
     updateTimeLabel(); // result is 1 hour less than picker 
     pickerView.animate({bottom: -280, duration: 500}); 
    }); 
    pickerView.add(toolbar); 
    pickerView.add(picker); 
    $.win.add(pickerView); 
    // picker opens with time that is +1 hour 
    pickerView.animate({bottom: 0, duration: 500}); 
} 


$.win.open(); 
updateTimeLabel(); 

Скриншот Screen shot of Ti.UI.Picker showing incorrect time

ответ

1

В моем случае я устанавливаю значение по умолчанию с помощью метода формата момент, и просто Дата и время:

picker.setValue(moment(someTime).format("YYYY-MM-DD")); 

и для времени кирки:

picker.setValue(moment(someTime).format("HH:mm")); 

Он отлично работает

-1

Просто быстро "угадать". Вы случайно попали в место, где есть летнее время?

Как я понимаю, «UTC» (не относится к моменту) - это «реальное» время по Гринвичу без летнего времени. Так что может быть тем, что дразнит вас.

Если да, то можете ли вы «конвертировать» время UTC, чтобы показывать «одни и те же» часы в «локальном» времени пользователей (или, по крайней мере, с коррекцией дневного света)? Затем конвертируйте обратно, как только пользователь закроет диалог.

Кто-то может быть в состоянии дать вам лучшее объяснение - и решение ;-)

/John

+0

Это должен быть комментарий, а не ответ. – RobG

+0

Я надеюсь избежать какой-либо поправки к часовому поясу/дневного света, поскольку я слышал, что это чревато подводными камнями, но я определенно хотел бы получить ответ, который бы решительно разрешал проблему любому пользователю в любой часовой пояс. – shrewdbeans

0

Вы используете временную метку (unix) для хранения даты/времени.Однако при отображении его вы используете timeJS Часовой пояс: http://momentjs.com/timezone/

С другой стороны, вы можете «захотеть» прослушать событие изменения, чтобы обновить ярлык.