0

我正在使用選取器(Ti.UI.Picker)並將類型設置爲Ti.UI.PICKER_TYPE_TIME。其目的是允許用戶更改數據庫中日期條目的時間。日期存儲在UTC時間戳中。流動是這樣的:Titanium/Appcelerator - 使用時間選擇器生成具有當地時間差的日期對象

  1. 用戶打開控制器
  2. 日期是從DB中提取,以及使用該方法moment.utc()存儲爲矩JS日期對象。
  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」(不是特定於Moment)是沒有夏時制的「真實」GMT時間。所以可能是什麼逗你。

如果是這樣,那麼你可以「轉換」UTC時間以顯示用戶「本地」時間(或至少夏令時校正)的「相同」小時嗎?然後在用戶關閉對話框後再轉換回來。

有人或許可以給你一個更好的解釋 - 和解決方案;-)

/約翰

+0

這應該是一個評論,而不是一個答案。 – RobG

+0

我希望避免任何時區/日光校正,因爲我聽說充滿陷阱 - 但我絕對會歡迎任何時區任何用戶可靠地解決問題的答案。 – shrewdbeans

0

您使用(unix)時間戳存儲日期/時間。但是在顯示時,請使用momentJS時區: http://momentjs.com/timezone/

在另一個說明中,您「可能」想要聽更改事件以更新標籤。