3 votes

Problème de classe de date : l'objet date est positionné à une valeur que je n'ai pas définie.

J'essaie d'ajouter un délai à un TrainTimeTable . J'ai effectué les arrivées et les départs des trains en utilisant Date objets. Lorsque j'imprime l'horaire pour la première fois, tout indique les heures d'arrivée et de départ correctes. Cependant, après avoir ajouté un retard de 30 minutes à toutes les stations Edmonton et suivantes, certaines heures d'arrivée et de départ deviennent incorrectes. Certaines heures d'arrivée et de départ deviennent incorrectes. Le retard ne devrait que repousser les heures d'arrivée et de départ, mais il modifie la durée du trajet entre certaines villes.

J'ai conçu mes getters et setters de la manière suivante :

/**
 * Accessor for arrival Date variable. Returns a copy of the arrival date.
 * @return - a copy of the arrival date
 */
public Date getArrivalDate()
{
    //return a copy of the original date
    return (Date) arrival.clone();
}

/**
 * Mutator for arrival date variable.
 * @param arrival - the date to set 
 */
public void setArrivalDate( Date arrival )
{
    //uses copy of Date passed in
    this.arrival = (Date) arrival.clone();
}

Voici ma méthode pour ajouter le délai J'utilise un LinkedList de Station des objets pour tenir le calendrier :

public void delay(String Station, int minute) {
    //sequential search for Station
    //iterate through list for Station
    boolean delayPoint = false;

    //1 ) adjust time of day
    //add delay to arrival and departure date objects
    for (Station current : schedule) {
        //By checking for delay before checking for the delay city
        //we will see the delayPoint variable set while on
        //the loop is at the station right afer the delayed Station
        //if after the delay point 
        if (delayPoint) {
            //then add delay to arrive date
            Date arrivalDate = current.getArrivalDate();
            long arrivalTime = current.getArrivalDate().getTime();
            arrivalTime += minute * MIN_TO_MS;
            arrivalDate.setTime(arrivalTime);
            current.setArrivalDate(arrivalDate);
            //and add delay to depart date
            Date departDate = current.getDepartureDate();
            long departTime = current.getDepartureDate().getTime();
            departTime += minute * MIN_TO_MS;
            departDate.setTime(departTime);
            current.setDepartureDate(departDate);

        } //if the Station matches the point of delay  
        else if (current.getCity().equals(Station)) {
            //then set the boolean
            delayPoint = true;
            //and add delay to departure
            Date departDate = current.getDepartureDate();
            long departTime = current.getDepartureDate().getTime();
            departTime += minute * MIN_TO_MS;
            departDate.setTime(departTime);
            current.setDepartureDate(departDate);
        }

    }
    //2 ) adjust day of trip
}

Voici mon résultat après avoir ajouté un délai de 30 minutes au départ d'Edmonton

S'il vous plaît et merci,
Ahsen Husain.

0voto

Daniel C. Points 3075

Voici une solution possible (basée sur java 8 et l'api java.time)

Classe de station

    public class Station {
        private long id;
        private String name;
        private Date arrivalDate;
        private Date departureDate; ....getters and setters

Liste de stations

    List<Station> myStations = Arrays.asList(
            new Station(1,"City1",new Date(),new Date()),
            new Station(2,"City2",new Date(),new Date()),
            new Station(3,"City3",new Date(),new Date()),
            new Station(4,"City4",new Date(),new Date())
    );

Le nom de la ville à trouver et le temps de retard en minutes.

String cityName = "City2";
int minutes = 30;

Obtenir la station qui est égale à CityName (Pour l'instant, je montre une alternative pour représenter la boucle avant).

    Station current = myStations.stream()
            .filter(s -> s.getName().equals(cityName))
            .findFirst().orElse(null);

La station actuelle est égale à Nom de la ville, alors ajoutons un délai

delay(current,minutes,false);

Ajoutez maintenant le retard aux stations suivantes (en supposant que les stations suivantes ont un id supérieur à celui de la station actuelle).

myStations.stream()
                .filter(s -> s.getId()>current.getId())
                .collect(Collectors.toList())
                .forEach(s -> delay(s,minutes,true));

méthode de retardement (cette méthode de retardement est basée sur l'api java.time)

public static void delay(Station current, int minutes, boolean isDelay){
    System.out.println("Current Station | Before: " + current);
    LocalDateTime stationArrival =null;
    LocalDateTime stationDeparture=null;

    if (current !=null && isDelay){
        stationArrival = getLocalDateTimeFromDate(current.getArrivalDate());
        stationDeparture = getLocalDateTimeFromDate(current.getDepartureDate());
        stationArrival=stationArrival.plusMinutes(minutes);
        stationDeparture=stationDeparture.plusMinutes(minutes);
        current.setArrivalDate(getDateFromLocalDateTime(stationArrival));
        current.setDepartureDate(getDateFromLocalDateTime(stationDeparture));
    }else if(current!=null && !isDelay){
        stationDeparture = getLocalDateTimeFromDate(current.getDepartureDate());
        stationDeparture= stationDeparture.plusMinutes(minutes);
        current.setDepartureDate(getDateFromLocalDateTime(stationDeparture));
    }

    System.out.println("Current Station | After: " + current);
}

méthode helppers pour transformer de Date <-> LocaleDateTime

public static  LocalDateTime getLocalDateTimeFromDate(Date date){
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}

public static Date getDateFromLocalDateTime(LocalDateTime localDateTime){
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

Cette alternative est basée sur l'api java.time utilisant LocalDateTime, java.time fonctionne parfaitement pour moi. Avec java.uitl.Date il y a beaucoup de transformations à faire, c'est très difficile à gérer. Si vous souhaitez en savoir plus sur java.time, voici un tutoriel. Api Java de la date et de l'heure.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X