2012-03-10 34 views
0

Evening、 エンティティが次のSimpleDate形式を使用してPriorityQueueに追加されるときのタイムスタンプを作成しようとしています。([yyyy/MM/dd-hh:mm:ss a]以下の結果)必要 ナノ秒の精度はありません100%のサンプルJava:SimpleDateFormatのタイムスタンプが更新されない

1:2012年3月9日 - 9時58分36秒PM

あなたは私が維持できる方法を知っていますか顧客が広告を表示したことを示す「経過時間」タイムスタンプPriorityQueueに捧げられますか?

私が出会ったStackOverflowスレッドでは、ほとんどがSystem.nanoTime()を使用しています。私はSimpleDateFormatにこれを実装するためのリソースをオンラインで見つけることはできません。私は同僚と相談しました。

(SO、それをサポートしている場合)。また、私は構文強調表示を使用していないことをお詫び申し上げます

コードの抜粋[未使用の方法は省略]:

<!-- 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秒の時間(以下を参照)
    • 遅らせるW /の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) 

は、私は私の質問が明確であると思います、ご協力いただきありがとうございます十分に&私はあなたのフォーマットガイドラインに十分に従っています。

+2

「日付」は自動的に更新されません。 'timeStamp.add(.... format(new Date()));'代わりに – Jon

+0

@Jon:パーフェクト、ありがとう。 –

答えて

1

最新のタイムスタンプを取得するには、毎回新しい日付のインスタンスを使用する必要があります。

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

上記の行にnew Date()dateを交換してみてください。

+1

これはあなたがこれを取ったものであれば、コメントにクレジットを追加してください... – Jon

+0

私は気にしない:)しかし、私はあなたのコメントを見た後投稿をした:) –

関連する問題