【原創】Time Calculator (TimeCalc) 時間計算器 for Nokia N9 & N950

開發誘因
距離相傳是世界末日的 2012 年 12 月 21 日,還有多少天?從出生起,我活了多少天?如果我現在為了《飢饉三十》停止進食,從何時起我可以恢復進食?

在日常生活中,相信好多人都會遇上這類與日期和時間計算相關的問題。以往我們不是單靠心算,就是要在日曆上數來數去;聰明一點的,就會到電腦面前打開Excel,輸入一個日期時間來加減。那麼如果就近沒有電腦和日曆,哪怎麼辦呢?

由於工作需要,我最近也不時需要計算開發項目中、各細項工作的預測完成日期。無論是在日曆上數來數去,又或是在 Excel 裡加減完還要搞數值格式,兩者都費時失事。於是,我便萌生製作一個簡單手機程式來計算日期和時間的念頭…


↑ 時間計算器會按照用家的系統語言,顯示相應的界面文字。第一個版本會先支援英文、正體中文及簡體中文。

功能簡介
經過一段日子斷斷續續的開發(我正職不是開發手機程式,所有開發都得在工餘時間做…),我終於弄好了一個功能比較簡單的版本,取名「TimeCalculator 時間計算器(TimeCalc)」。

TimeCalc是一個簡單就手的小工具,可讓你加減一個數目的年、月、日、工作日(週一至五)、小時、分鐘或秒鐘,至一個日期/時間值裡。你亦可求得兩個日期/時間值的差距,並以各種時間單位顯示出來。
功能圖解


↑ 在一個日期/時間值之上,加/減一個時間單位的值。




↑ 加/減 的數值支援小數…




↑…亦支援負數。在這個例子裡,我們可看到負負得正的效果!;)
此外,輸入數值時,系統會顯示數字虛擬鍵盤。




↑留意數字虛擬鍵盤的「計算」一詞,亦會因應系統語言而改變。




↑ QML 的標準日期選擇元件。




↑ QML 的標準時間選擇元件。




↑ 時間單位選擇介面。




↑ TimeCalc 支援橫向操作。




↑ 橫向操作時,數字虛擬鍵盤亦會相應調整。




↑ TimeCalc的另一個功能,就是可以計算兩個日期/時間值之間的差距,並可以不同的時間單位顯示出來。




↑ 按右下角的「三劃按鈕」,調出程式選單。




↑ 關於本程式。




↑ 版權資訊界面。


功能定義及運算假設
根據公曆(格里曆)的定義,本程式採納以下的假設來進行日期及時間的運算:
  • 1 年 = 365.25 日
  • 1 個月 = 30.436875 日
  • 1 週 = 7 日
  • 1 日 = 24 小時
  • 1 工作日 =週一至週五的其中一日,但本地公眾假期除外
  • 1 小時 = 60 分鐘
  • 1 分鐘 = 60 秒
  • 最早支援日期:公元前 4713 年 1 月 2 日(儒略日翌日)
  • 最早可選擇日期:1900 年 1 月 1 日 00:00:00
  • 最遲可選擇日期:2099 年 12 月 31 日 23:59:59
  • 公元 2012 減 2012 年 = 公元前 1 年(因按照公曆定義,0年並不存在)
高清影片示範

http://www.youtube.com/watch?v=2tBuNLCROeo&feo
↑ 廣東話示範(以 N9 示範)

http://www.youtube.com/watch?v=BAKYlfSDJvA
↑ 英文示範(以 N950 示範)

開發點滴
這個應用程式是以 QML 及 JavaScript開發,並具備以下特色:
  • 選擇日期和時間的元件,是屬於 Qt Quick 1.1 額外為 Symbian 及 MeeGo 1.2 Harmattan提供DatePickerDialogTimePickerDialog,使用前必先作以下宣告:

    import QtQuick 1.1
    import com.nokia.meego 1.0
    import com.nokia.extras 1.0


    其中 DatePickerDialog可透過設定 maximumYearminimumYear屬性來指明可選擇的年份範圍。maximumYear 的預設值是今年+20 年,而 minimumYear屬性的預設值則是今年。如果你指明一個很大的範圍(如0 -2999),元件以至整個應用程式的初次載入速度就會變得很慢,甚至要等幾秒才能載入完成。基於這個原因,我把此程式的最早可選擇年份定為1900,最遲可選擇年份定為 2099年,希望在速度和可用性(未來幾十年都夠用吧?如果…世界末日未到的話! )之間取得平衡。
  • 大部份的日期和時間運算,都是運用了 QML 裡的 JavaScript引擎的原生的日期/時間函數。奇怪的是,只有QML 的 JavaScript 引擎處理日期時有儒略日翌日的限制(如果是故意設限,哪為甚麼是翌日?);而 N9 原生瀏覽器的 Webkit2 /JavaScript引擎、以至所有桌面電腦主流的瀏覽器(IE、Firefox、Chrome、Safari和 Opera)都沒有這個限制。
  • 當 QML 的 JavaScript引擎在處理兩位數字的年份時,會把該年份當成 19XX年。例如 12 年會自動變成 1912 年;即使你在建立新的Date() 變數時直接指明 x = newDate(2012-2000,1,1,0,0,0,0),你都會得出一個 1912 年 1月 1日的數值。不過這種假設亦同樣出現於桌面電腦主流的瀏覽器(有點「千年蟲」的氣味!)。在這程式裡,我要寫硬額外的語句,特別處理計算結果為兩位數年份的例子;
  • 以 Qt 原生的多語言支援語法及 QtLinguist,製作出隨系統語言而套用的英文、正體中文及簡體中文界面;當中以SelectionDialog元件內的選項的文字國際化並不能直接以普通的qsTr()QT_TR_NOOP() 來達成 ,而是必須透過程式啟動時(即 Component.onCompleted事件),調用一個特製的 JavaScript 函數,來建立SelectionDialog元件所使用的 ListModel的各選項值。這時各選項值的文字就可以使用qsTr() 來進行翻譯;
  • 計算加/減工作日(週一至週五),以及計算兩個日期之間的工作日差距,所涉及的邏輯並不能單靠JavaScript 自身提供的日期函數解決,必須額外編寫。
程式源碼及下載
本程式已可在 Nokia 商店下載安裝。在你的 N9 的 Nokia商店應用程式裡,搜尋「TimeCalc」即可找到。你亦可直接按一下下面的鏈結:

http://store.ovi.com/content/259849

我已把這個程式的源碼放上諾基亞的項目網站:

http://projects.developer.nokia.com/timecalc

如果你對編寫 QML應用程式有興趣,你可以在上面的鏈結找到程式的源碼。
如果你有興趣參與改良此程式,又或想提交更多語言的翻譯版本,可以在上面的鏈結裡找到SubVersion 的鏈結,然後以你喜愛的 SVN 工具 Checkout到你的電腦就可以了。
後話
如果大家使用這應用程式時有甚麼意見或問題需要匯報,請在此文留言告知小妹。我會盡力跟進的!
這個應用程式的功能看似簡單,不過在開發期間遇到前面所述的問題,卻是我始料未及的。在開發過程中我要更深入了解日期和時間的背景資料,並從維基百科學到不少與日期和時間相關的冷知識呢!
TimeCalc 目前尚在初版;未來當我有較多時間時,我會考慮再改良及加入更多的功能,包括讓用家自行指明當地的公眾假期、以及週六會否有半天/全天工作日,讓「工作日」的計算更精準;我亦會看看有沒有可能讓此程式的用家、以計算結果直接建立行事曆的約會事件等。我也會學習一下其他系統平台的應用程式開發(會先考慮Windows Phone 和 Android),未來或許也會把 TimeCalc 甚至打字易 都移植到這些平台也說不定?

☆★ 同步發表於《Da Da 寫意空間》 ★☆