【问题标题】:How to record the time and duration of each question in java?java中如何记录每道题的时间和持续时间?
【发布时间】:2021-09-05 16:33:32
【问题描述】:

我在记录带有多项选择的测验代码的时间和持续时间时遇到问题。

这是回答完所有问题后最终输出的样本。

问题 # 你的答案备注 持续时间

1 B 错误 10:32 AM 30 秒

2 A 正确 10:33 AM 22 秒 //重复直到问题 #5

这是代码:

package timer;
import java.util.Date;
import java.util.Scanner;
import java.text.*;
import java.util.concurrent.TimeUnit;

public class num4 {
public static void main (String [] args) throws InterruptedException{
    
   Scanner scan=new Scanner(System.in); 
    Date date=new Date();
    SimpleDateFormat ft = 
  new SimpleDateFormat ("MMMM dd,yyyy '@'hh:mm a ");
   String one,two,three,four,five;
   String o,t,th,f,fi;
   int variable=0,wrong=0,seconds,minutes;
   final long startTime = System.nanoTime();
   System.out.println("Welcome to the rawr game!\n");
   Thread.sleep(1000);

   System.out.println("Question #1");
   System.out.println("What can one catch that is not thrown?");
   System.out.println("[A] rain");
   System.out.println("[B] a cold");
   System.out.println("[C] a secret");
   System.out.println("[D] snow");
   
    System.out.print("\nYour answer: ");
    one=scan.next();
    if(one.equals("B")){
        o="Correct";
        variable=variable+1;
    }else{
         o="Wrong";
         wrong=wrong+1;
    }
    
   System.out.println("\nQuestion #2");
   System.out.println("Pambansang Editor: ");
   System.out.println("[A] Netflix");
   System.out.println("[B] Youtube");
   System.out.println("[C] Facebook");
   System.out.println("[D] Instagram");
   
   System.out.print("\nYour answer: ");
   two=scan.next();
   if(two.equals("D")){
        t="Correct";
        variable=variable+1;
    }else{
         t="Wrong";
          wrong=wrong+1;
    }
   
   System.out.println("\nQuestion #3");
   System.out.println("Indian's Population in 2020");
   System.out.println("[A] 1.333 billion");
   System.out.println("[B] 1.300 billion");
   System.out.println("[C] 1.333 million");
   System.out.println("[D] 1.336 billion");
   
   System.out.print("\nYour answer: ");
   three=scan.next();
   
   if(three.equals("D")){
        th="Correct";
        variable=variable+1;
    }else{
         th="Wrong";
          wrong=wrong+1;
    }
   
   System.out.println("\nQuestion #4");
   System.out.println("Man's Bestfriend?");
   System.out.println("[A] dogs");
   System.out.println("[B] cat");
   System.out.println("[C] hamster");
   System.out.println("[D] none");
   
   System.out.print("\nYour answer: ");
   four=scan.next();
   if(four.equals("A")){
        f="Correct";
        variable=variable+1;
    }else{
         f="Wrong";
          wrong=wrong+1;
    }
   
   System.out.println("\nQuestion #5");
   System.out.println("Who steal the pot of soup in Episode 100 of Mark Angel Comedy? ");
   System.out.println("[A] Emmanuella");
   System.out.println("[B] The Iphone Girl");
   System.out.println("[C] Denilson");
   System.out.println("[D] Kbrown");
   
   System.out.print("\nYour answer: ");
   five=scan.next();
   if(five.equals("C")){
        fi="Correct";
        variable=variable+1;
    }else{
         fi="Wrong";
          wrong=wrong+1;
    }
   
   

  System.out.println("=====");
  System.out.println("Rawr quiz on " + ft.format(date));
  System.out.println("=====");
  
  System.out.println("Question #\tYour Answer\tRemarks\tTime\tDuration");
  System.out.println("1\t\t"+one+"\t\t"+o);
  System.out.println("2\t\t"+two+"\t\t"+t);
  System.out.println("3\t\t"+three+"\t\t"+th);  ///as you can see in this part
  System.out.println("4\t\t"+four+"\t\t"+f);    //// it's not complete
  System.out.println("5\t\t"+five+"\t\t"+fi);   ///I'm having trouble on how 
                                                /// to get the time and duration
  
  System.out.println("Number of Correct Answers: "+variable+"\t\tNumber of Wrong Answers: "+wrong);

  final long duration = System.nanoTime()- startTime;
  seconds =(int) (duration/1000000000);
  minutes= (int)  (seconds/60);
  if (minutes<=1){
      System.out.println("Total Duration: "+minutes+" minute");
  }else{
      System.out.println("Total Duration: "+minutes+" minutes");
  }
  

 }
 }

【问题讨论】:

  • 不要再使用 java.util.Date。使用新的 java.time.* API

标签: java time duration


【解决方案1】:

永远不要使用DateCalendarSimpleDateFormat 类。仅使用 java.time 类进行日期时间处理。

当您开始提问时,请捕捉以 UTC 显示的当前时刻。

Instant start = Instant.now() ;

用户回答后,记录经过的时间。

Duration d = Duration.between( start , Instant.now() ) ;

获取以整秒为单位的总经过时间。

long seconds = d.toSeconds() ;

Instant 调整为时区以显示给用户。

ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = instant.atZone( z ) ;

生成文本。

Locale locale = Locale.getDefault() ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT ).withLocale( locale ) ;
String output = zdt.format( f ) ;

在一对数组中跟踪每个问题的开始和持续时间。或者定义你自己的类来一起跟踪它们。在 Java 16+ 中,使用 record 来定义该类。您可以在本地定义记录,也可以嵌套或单独定义。

record Response( Instant start , Duration duration ) {}

定义一个列表,然后填充。

List< Response > reponses = new ArrayList<>() ;
…
responses.add( new Response( start , d ) ) ;

您可以添加更多成员字段来跟踪用户对每个问题的回答,并标记是否正确。

record Response( int answer, boolean correct , Instant start , Duration duration ) {}

【讨论】:

  • 我会使用FormatStyle.SHORT,因为OP问题中的格式是hh:mmaa10:32AM/10:33AM),但我仍然喜欢这个答案。 +1
  • @CardinalSystem 公平点;如此改变。谢谢。
  • 罗勒布尔克谢谢!我已经尝试过了,这是 PT7.912046S 的结果之一。如何删除 PT 和小数?
  • @Marie 我在答案中显示了Duration#toSeconds
【解决方案2】:

Jens 是对的。您应该使用 Java Time API。我建议查看LocalTimeDuration。对于每个问题,您可以使用以下内容来计算持续时间:

LocalTime questionOneStart = LocalTime.now();
one = scan.next();
LocalTime questionOneEnd = LocalTime.now();
Duration questionOneDuration = Duration.between(questionOneStart, questionOneEnd);

此外,使用 LocalTime 可以让您准确说出用户回答问题的时间。我会在你的情况下使用LocalTime#format(java.time.format.DateTimeFormatter)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mmaa");
String answerTimeString = questionOneEnd.format(formatter);

要打印用户回答问题所用的持续时间,您可以使用Duration#getSeconds。您还可以使用toDaystoHourstoMinutestoMillistoNanos,具体取决于您的要求。

【讨论】:

  • 本地时间问题OneStart = LocalTime.now();一 = scan.next(); LocalTime questionOneEnd = LocalTime.now();持续时间 questionOneDuration = Duration.between(questionOneStart, questionOneEnd);我应该把它放在每个问题之前吗?
  • 我不敢依赖LocalTime。以防万一测验在午夜结束。此外,如果正在进行夏令时转换(DST 转换),则持续时间将是错误的。仍然是一个包含很多好信息的答案。
  • @Marie 没有。每次拨打scan.next() 时都会这样做。前一次,后一次。就像我在回答中展示的那样。这样,您就有时间在用户回答问题时向用户提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多