Java: отметка времени SimpleDateFormat не обновляется - PullRequest
0 голосов
/ 10 марта 2012

Вечер, Я пытаюсь создать временную метку, когда объект добавляется в мой PriorityQueue, используя следующий формат SimpleDate: [гггг / мм / дд - чч: мм: сс а] (примеры результатов ниже) Нано-секундная точность НЕ 100% необходима

1: 2012/03/09 - 09:58:36 PM

Знаете ли вы, как я могу сохранить временную метку «истекшее время», которая показывает, когда клиенты были добавлены в PriorityQueue?

В потоках StackOverflow, с которыми я сталкивался, большинство говорят, что используют System.nanoTime (); хотя я не могу найти ресурсы в Интернете для реализации этого в SimpleDateFormat. Я также консультировался с коллегами.

Кроме того, я прошу прощения за то, что не использовал подсветку синтаксиса (если S.O поддерживает это)

Отрывок кода [неиспользуемые методы опущены]:

 <!-- language: java -->
 package grocerystoresimulation;
 /*****************************************************************************
 * @import
 */
 import java.util.PriorityQueue;
 import java.util.Random;
 import java.util.ArrayList;
 import java.util.Date;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 /************************************************************************************
 public class GroceryStoreSimulation {
 /************************************************************************************
 * @fields 
 */
    private PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    private Random rand = new Random(); //instantiate new Random object

    private Date date = new Date();
    private DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd - hh:mm:ss a"); 
    private ArrayList<String> timeStamp = new ArrayList<String>(); //store timestamps

    private int customersServed; //# of customers served during simulation
/************************************************************************************
 * @constuctor
 */
    public GroceryStoreSimulation(){
        System.out.println("Instantiated new GroceryStoreSimulation @ ["
                + dateFormat.format(date) + "]\n" + insertDivider());

        //Program body
        while(true){
            try{
                Thread.sleep(generateWaitTime()); 
                newCustomer(customersServed);
            } catch(InterruptedException e){/*Catch 'em all*/}
        }
    } 
/************************************************************************************
 * @param String ID
 */ 
   private void newCustomer(int ID){
       System.out.println("Customer # " + customersServed + " added to queue. . .");
       pq.offer(ID); //insert element into PriorityQueue
       customersServed++;
       assignArrivalTime(ID); //call assignArrivalTime() method
   } //newCustomer()
/************************************************************************************
 * @param String ID 
 */
   private void assignArrivalTime(int ID){
       timeStamp.add(ID + ": " + dateFormat.format(date));
       System.out.println(timeStamp.get(customersServed-1));
   } //assignArrivalTime()
/************************************************************************************ 
 * @return int 
 */
   private int generateWaitTime(){
       //Local variables
       int Low = 1000;  //1000ms
       int High = 4000; //4000ms
       int waitTime = rand.nextInt(High-Low) + Low;
       System.out.println("Delaying for: " + waitTime); 
       return waitTime;
   }
//***********************************************************************************
   private static String insertDivider(){
       return ("******************************************************************");
   }
//***********************************************************************************
} //GroceryStoreSimulation

Проблема:

  • Отметка времени не обновляется , только представляет начальное время выполнения (см. Ниже)
    • Задержка на 1-4 секунды с Thread.sleep (xxx) (генерируется псевдослучайно)
    • Проблема может быть в методе assignArrivalTime ()

Выход:

run:
Instantiated new GroceryStoreSimulation @ [2012/03/09 - 09:58:36 PM]
******************************************************************
Delaying for: 1697
Customer # 0 added to queue. . .
0: 2012/03/09 - 09:58:36 PM
Delaying for: 3550
Customer # 1 added to queue. . .
1: 2012/03/09 - 09:58:36 PM
Delaying for: 2009
Customer # 2 added to queue. . .
2: 2012/03/09 - 09:58:36 PM
Delaying for: 1925
BUILD STOPPED (total time: 8 seconds)

Спасибо за вашу помощь, надеюсь, мой вопрос достаточно ясен, и я в достаточной степени следовал вашим правилам форматирования.

1 Ответ

1 голос
/ 10 марта 2012

Вы должны каждый раз использовать новый экземпляр Date для получения самой последней отметки времени.

private void assignArrivalTime(int ID){
    timeStamp.add(ID + ": " + dateFormat.format(date)); 
------------------------------------------------^^^^

Попробуйте заменить date на new Date() в строке выше.

...