2016-05-18 54 views

回答

2

您可以創建一個與您的字符串匹配的SimpleDateFormat。然後,您將使用該類的.parse()方法將您的字符串轉換爲Date。有關更詳細的答案,請參閱this question

或者,您可以創建一個Calendar對象,並解析您的字符串以設置其適當的字段,然後使用.getTime()來提取Date

編輯 受Gilbert Le Blanc的回答的啓發,我更簡單地製作了他的測試用例。我使用的步驟是:

  1. 使用SimpleDateFormat解析給定字符串包括日期,生產日期在1970年
  2. 調整任何DST抵消
  3. 計算有多少個星期,在過去的解析日期是。
  4. 將此週數添加到過去的日期,以使其成爲下一個未來日期。我的程序的

測試輸出相匹配吉爾伯特(在我的時區):

Monday, 9:30 --> Mon May 23 09:30:00 PDT 2016 
Friday, 16:45 --> Fri May 20 16:45:00 PDT 2016 
Wednesday, 22:15 --> Wed May 18 22:15:00 PDT 2016 

你可以調整的基礎上你真的「下一步」的意思的做法。這是我的完整代碼:

package foo.bar; 

import java.text.ParsePosition; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class DayTime { 

    public static final long MILLISECONDS_PER_WEEK = 7L * 24 * 60 * 60 * 1000; 

    public static void main(String[] args) { 
     getDate("Monday, 9:30"); 
     getDate("Friday, 16:45"); 
     getDate("Wednesday, 22:15"); 
    } 

    private static void getDate(String input) { 
     // Parse given date. Convert this to milliseconds since epoch. This will 
     // result in a date during the first week of 1970. 
     SimpleDateFormat sdf = new SimpleDateFormat("E, H:mm"); 
     Date date = sdf.parse(input, new ParsePosition(0)); 

     // Convert to millis and adjust for offset between today's Daylight 
     // Saving Time (default for the sdf) and the 1970 date 
     Calendar c = Calendar.getInstance(); 
     int todayDSTOffset = c.get(Calendar.DST_OFFSET); 
     c.setTime(date); 
     int epochDSTOffset = c.get(Calendar.DST_OFFSET); 

     long parsedMillis = date.getTime() + (epochDSTOffset - todayDSTOffset); 

     // Calculate how many weeks ago that was 
     long millisInThePast = System.currentTimeMillis() - parsedMillis; 
     long weeksInThePast = millisInThePast/MILLISECONDS_PER_WEEK; 
     // Add that number of weeks plus 1 
     Date output = new Date(parsedMillis + (weeksInThePast + 1) * MILLISECONDS_PER_WEEK); 

     System.out.println(input + " --> " + output); 
    } 
} 
1

我寫了一個轉換程序。這裏是測試結果。

Monday, 9:30 --> Mon May 23 09:30:00 MDT 2016 
Friday, 16:45 --> Fri May 20 16:45:00 MDT 2016 
Wednesday, 22:15 --> Wed May 18 22:15:00 MDT 2016 

我假設輸入時間是24小時時間。我在山區時區(MDT)。日期結果將在您運行此代碼的任何時區中。

我還假設如果今天的工作日與輸入的工作日相同,我輸出今天的日期。隨意添加代碼來檢查當前時間,以查看約會是今天還是下週。我認爲這超出了要求的範圍。

下面是我如何創建日期輸出。

  1. 我用「,」分割輸入。

  2. 我用當前日期和時間創建了一個Calendar對象。

  3. 我將星期幾文本轉換爲星期幾整數。

  4. 我添加了到達下一個週日整數所需的天數。

  5. 我使用SimpleDateFormat解析時間部分,並將時間複製到Calendar對象。

這是代碼。這並不簡單。

package com.ggl.testing; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

public class DayTime { 

    public static void main(String[] args) { 
     getDate("Monday, 9:30"); 
     getDate("Friday, 16:45"); 
     getDate("Wednesday, 22:15"); 
    } 

    private static void getDate(String input) { 
     DayTime dayTime = new DayTime(); 
     Date output = dayTime.createDate(input); 
     System.out.println(input + " --> " + output); 
    } 

    public Date createDate(String input) { 
     String[] parts = input.split(", "); 
     Calendar now = Calendar.getInstance(); 
     setDate(parts, now); 
     setTime(parts[1], now); 
     return now.getTime(); 
    } 

    private void setDate(String[] parts, Calendar now) { 
     int weekday; 
     switch (parts[0]) { 
     case "Sunday": 
      weekday = Calendar.SUNDAY; 
      break; 
     case "Monday": 
      weekday = Calendar.MONDAY; 
      break; 
     case "Tuesday": 
      weekday = Calendar.TUESDAY; 
      break; 
     case "Wednesday": 
      weekday = Calendar.WEDNESDAY; 
      break; 
     case "Thursday": 
      weekday = Calendar.THURSDAY; 
      break; 
     case "Friday": 
      weekday = Calendar.FRIDAY; 
      break; 
     default: 
      weekday = Calendar.SATURDAY; 
      break; 
     } 

     int currentWeekday = now.get(Calendar.DAY_OF_WEEK); 

     if (weekday == currentWeekday) { 
      return; 
     } 

     int difference = (weekday - currentWeekday + 7) % 7; 
     now.add(Calendar.DAY_OF_MONTH, difference); 
    } 

    @SuppressWarnings("deprecation") 
    private void setTime(String part, Calendar now) { 
     Date date = getTime(part); 
     if (date != null) { 
      now.set(Calendar.HOUR_OF_DAY, date.getHours()); 
      now.set(Calendar.MINUTE, date.getMinutes()); 
      now.set(Calendar.SECOND, date.getSeconds()); 
     } 
    } 

    private Date getTime(String part) { 
     SimpleDateFormat sdf = new SimpleDateFormat("H:mm"); 
     try { 
      return sdf.parse(part); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

} 
+0

由於'SimpleDateFormat'在內部使用了Calendar,並且有默認值(恰好在1970年),所以有點矯枉過正。只需解析1970年的日期,然後提前數週以使其「下週」即可完成。 –

相關問題