2017-08-19 5 views
1

Ich habe eine parametrisierte Methode:Parametrieren ZonedDateTime Methode

private static Date getTimeFor(int hour, int minute, int second, int nanoSecond, String zoneId) { 
    ZonedDateTime time = ZonedDateTime.now() 
      .withZoneSameLocal(ZoneId.of(zoneId)) 
      .withHour(hour) 
      .withMinute(minute) 
      .withSecond(second) 
      .withNano(nanoSecond); 
    return Date.from(time.toInstant()); 
} 

Gefolgt von:

private Date getRomeStartTime(){ 
     return getTimeFor(8,30,0,0,"Europe/Rome"); 
    } 

    private Date getParisStartTime(){ 
     return getTimeFor(9,30,0,0,"Europe/Paris"); 
    } 

    private Date getLondonStartTime(){ 
     return getTimeFor(9,00,0,0,"Europe/London"); 
    } 

Dies kann schnell aus der Hand als weitere Städte hinzugefügt werden. Ich bin mit dem Ziel, nur öffentlich/aussetzen der unten Methode zu machen und den Bau von StartTimes an anderer Stelle delegiert:

public Date getEffectiveTimeFor(String zoneId){ 
     // Delegate construction as per zoneId elsewhere 
     // dont want to use a long-winded if-else statement 
    } 

Ich kann das Strategie-Muster verwenden, da ich nicht ein Objekt übergeben sollte, sondern nur eine Saite. Was ist der beste Ansatz hier?

(P. S. I haben die alte Date zurückzukehren, ist dies über die Frage)

+3

Nun, Sie könnten eine Karte verwenden, um die Startzeit jeder Zonen-ID zu speichern. Ist es das, was du fragst? –

+1

Ja, genau das ist es! Vielen Dank. Meine Gedanken kreisten immer wieder um Muster und funktionale Schnittstellen, da ich in letzter Zeit zu viel Zeit mit ihnen verbracht habe. Dies ließ mich eine so einfache Lösung übersehen. Fühlen Sie sich frei zu beantworten, ich werde akzeptieren – Andrejs

+0

In 'ZonedDateTime', anstatt jedes Feld separat zu ändern, können Sie auch' mit (LocalTime.of (Stunde, Minute, Sekunde, Nanosec)) 'aufrufen. Wenn Sie die von @JBNizet vorgeschlagene Kartenlösung verwenden, ist der Aufruf 'with (LocalTime)' besser, da er den Code klarer und kürzer macht (IMO). –

Antwort

1

Sie können einfach eine Map<String, LocalTime> verwenden, um die Startzeit für jede Zone ID zu speichern. Dann hol dir die Startzeit von dieser Karte in deiner Methode und erstelle das Datum von dort.