2017-06-23 36 views
1

我正在爲音樂場地的調度系統工作。基本思想是有一個「創建新時間表」頁面,在該頁面上有一個DatePicker日曆(使用AngularUI Bootstrap)。用戶選擇一個日期,然後將表演者添加到時間片中。建成的物體看起來像這樣:纏繞我的頭周圍如何處理日期

{ 
    date: 2017-6-22 00:00:00.000-5:00 
    venue: VenueID 
    performances: [ 
    { 
     performer: performerID, 
     time: 2017-06-22 22:00:23.231-5:00 
    },{ 
     perfomer: performer2ID, 
     time: 2017-06-22 23:00:42.523-5:00 
    } 
    ] 
} 

這裏有幾個問題。對於原始日期選擇,我將時間(使用myDate.setHours(0,0,0,0))設置爲午夜,因爲時間並不重要,我只關心實際日期。同樣的時間段,他們的日期並不重要(因爲他們屬於當天的時間表),所以我只關心時間。然後在另一個項目中,我們有一個節點/ mongo應用程序保存這些時間表,並將它們返回到角度項目中的頁面,以便選擇編輯/等的時間表。它通過獲取特定場所的所有時間表來選擇要返回哪些時間,並且執行「if(schedule.date> = new Date()。setHours(0,0,0,0)){add schedule to return list}」

無論如何,要解決實際問題。角度的應用程序會執行所有的日期計算客戶端。我的意思是,我在CST。如果我在日曆上選擇日期並保存該日期的時間表,則EST中的某個人選擇日曆中的同一天並保存日程表,他們在數據庫中有不同的日期。例如,在制定日程安排時,數據庫中的日期爲「2017-06-22 00:00:00.000-5:00」。當EST朋友在同一日期制定日程安排時,它會保存爲「2017-06-22 00:00:00.000-4:00」。

在「選擇一個時間表來查看/編輯」頁,我做這樣的事情:

<select ng-model="schedule" ng-options="s.date|date:'fullDate' for s in schedules" ng-show="schedules.length>=1"></select> 

當然,這並不工作,因爲當我的朋友EST着眼於列表中,他看到了正確的日期。但是當我查看他創建的一個日期時,由於「2017-06-22 00:00:00.000-4:00」轉換爲本地時區的日期爲「2017-06-21 23:00:00.000- 5:00" 。

我想TL; DR是我不確定如何處理它,因爲場地和任何創建/編輯時間表的人可能不會共享相同的時區。我希望所有的日期/時間顯示在場地的時區(我有地址,我想我可以通過地理定位找到時區?)。我只是不確定如何去做。

+0

看看[moment.js](https:// momentjs。com /),讓你的生活更輕鬆 – Slim

回答

0

DatePicker爲您提供日期對象。而不是存儲整個值字符串只是抓住一天一個月和一年Date(value).getYear() + '-' + Date(value).getMonth() + '-' + Date(value).getDate()。至於時間與日期相同。將這些值存儲在數據庫中,然後當你將它們返回時,必須將它們轉換回日期對象,以便日期選擇器可以理解它們。

最終使用此解決方案,您只是試圖存儲沒有時區的日期。請確保在您的應用中聲明時間適用於這些區域。

+1

* getFullYear *應該用來代替* getYear *,月份是基於零的,所以'getMonth()'應該是'getMonth()+ 1',不斷分析*值*是低效率和有問題的因爲它不是標準格式,至少在Safari中返回無效日期。 – RobG

0

您的日期/時間被輸送的格式,保存與日期將如何顯示給用戶區別開來。

  • 對於運輸和保存,使用UTC格式易於計算(例如:ISO8601)。
  • 對於用戶可視化,通過使用some helper library將此值轉換爲時區和所需的用戶格式。