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

  1. Пользователь открывает контроллер
  2. Дата извлекается из БД и сохраняется как объект даты Moment 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();

< Сильный > Скриншот Снимок экрана Ti.UI.Picker, показывающий неправильное время

1
shrewdbeans 12 Янв 2017 в 21:55

3 ответа

Лучший ответ

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

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

И для сборщиков времени:

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

Работает отлично

1
Ricardo Pereira 17 Янв 2017 в 17:51

У меня была точно такая же проблема, но я понял, что разница в 1 час произошла из-за перехода на летнее время, добавление toLocaleString () к возвращенному значению исправило это для меня.

1
ChimpWorks 15 Мар 2018 в 10:55

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

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

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

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

/ John

-1
John Dalsgaard 13 Янв 2017 в 08:43