如何解决java中如何记录每道题的时间和时长?
我在用多项选择记录测验代码的时间和持续时间时遇到问题。
这是回答完所有问题后最终输出的样本。
问题 # 您的答案备注了时长
1 B 错误 10:32AM 30 秒
2 A 正确 10:33AM 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");
}
}
}
解决方法
切勿使用 Date
、Calendar
、SimpleDateFormat
类。仅使用 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 ) {}
,
Jens 是对的。您应该使用 Java Time API。我建议查看 LocalTime
和 Duration
。对于每个问题,您可以使用以下内容来计算持续时间:
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
。您还可以根据需要使用 toDays
、toHours
、toMinutes
、toMillis
和 toNanos
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。