- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于创建24小时倒计时的代码。
此代码检查“日期”文件是否存在,如果不存在,则创建一个文件,其中包含每天24小时的日期和时间。然后,它获取当前时间并进行比较,以创建从当前日期到文档中日期的倒计时。
即使代码已“关闭”,这也可以保存计时器并检查计时器的时间。唯一的问题是计时器有时会变为负数。就像如果我从头开始运行代码时,没有在星期一(午夜之前)创建任何“日期”文件,那么可以说星期一是晚上11点半。然后,如果我停止代码并在当前日期已经过了午夜时再次运行它,那么实际上是星期二,但是在达到实际目标计时器之前,仍然有多达23小时的时间缺失。在这种情况下,倒数时间为负。就像它会显示“ -1day 23hours 60minutes and 60seconds left”。但是,例如,如果从周二午夜开始重新运行,然后在当天30分钟后重新启动,则没有问题。
希望您能理解问题所在,很难通过文字表达。但是我附上了我的全部代码,这是我正在使用的确切代码,并且其中存在这个问题。该代码对每一个发生的动作都有注释,因此应该很容易理解。
static File dFileD = new File("date.txt");
static String date = "";
public static void main(String[] args) throws ParseException {
Timer tickTock = new Timer();
TimerTask tickTockTask = new TimerTask(){
public void run(){
try {
timFunRun(); //Timer calls method to start the countdown
} catch (ParseException e) {
e.printStackTrace();
}
}
};
tickTock.schedule(tickTockTask, 1000, 1000);
}
static void timFunRun() throws ParseException {
if (!dFileD.exists()){ //if it doesn't exist, first part
//Get current date and time
Calendar startDat = Calendar.getInstance();
System.out.println("Current date: " + startDat.getTime());
//Get that current date and time and then add 1 day
Calendar todAdd = Calendar.getInstance();
todAdd.add(Calendar.DATE, 1);
System.out.println("Date in 1 day: " + todAdd.getTime());
//Create a format for sending date to text file
SimpleDateFormat formDat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
String formatted = formDat.format(todAdd.getTime());
System.out.println("Formatted: " + formatted);
try{
PrintWriter dW = new PrintWriter("date.txt");
dW.println(formatted);
dW.close();
} catch (IOException e) {
}
System.out.println(formDat.parse(formatted));
} else { //if it does exist, second part
//Get current date and time
Calendar currentDeT = Calendar.getInstance();
System.out.println("Current date: " + currentDeT.getTime());
SimpleDateFormat formDat2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
Date dateFroText = null; //Get the "goal" date
try {
Scanner dateRead = new Scanner(dFileD);
while (dateRead.hasNextLine()) {
date = dateRead.nextLine();
dateFroText = formDat2.parse(date);
System.out.println("Date from text new format: " + dateFroText);
}
dateRead.close();
} catch (Exception e) {
System.out.println("Error!");
}
if (dateFroText != null){ //method to compare the current date and the goal date
Calendar dateFromTxtCal = Calendar.getInstance();
dateFromTxtCal.setTime(dateFroText);
int yearDiff = dateFromTxtCal.get(Calendar.YEAR) - currentDeT.get(Calendar.YEAR);
int dayDiff = ((yearDiff*365) + dateFromTxtCal.get(Calendar.DAY_OF_YEAR)) - currentDeT.get(Calendar.DAY_OF_YEAR);
dayDiff--;
int hourDiffer = dateFromTxtCal.get(Calendar.HOUR_OF_DAY)+23 - currentDeT.get(Calendar.HOUR_OF_DAY);
int minuDiff = dateFromTxtCal.get(Calendar.MINUTE)+60 - currentDeT.get(Calendar.MINUTE);
int secoDiff = dateFromTxtCal.get(Calendar.SECOND)+60 - currentDeT.get(Calendar.SECOND);
System.out.println(dayDiff + " days " + hourDiffer + " hours " + minuDiff +" minutes " + secoDiff + "seconds remaining");
}
}
}
最佳答案
避免遗留日期时间类
你太辛苦了而且您正在使用麻烦的旧日期时间类,而现在这些类已经被java.time类取代并取代了。
在UTC工作
另外,如果您只关心接下来的24小时,则无需时区。只需使用UTC。Instant
Instant
类代表UTC在时间轴上的时刻,分辨率为nanoseconds(最多九(9)个十进制小数位)。
Instant instantNow = Instant.now();
Duration
Duration
或
Period
类表示未附加到时间线上的时间跨度。
Duration duration = Duration.ofHours( 24 );
Duration
添加到
Instant
。 java.time类使用不可变的对象,因此这种操作的结果是一个具有基于原始值的新鲜对象。
Instant instantLater = instantNow.plus( duration );
String output = instantNow.toString();
Duration remaining = Duration.between( Instant.now() , instantLater );
toString
。
format for durations是
PnYnMnDTnHnMnS
。
P
标记开始(对于
Period
),
T
将任何年-月-日期与小时-分钟-秒分开。
String outputRemaining = remaining.toString();
to…Part
方法。奇怪的是,这些方法在Java 8的原始
java.time.Duration
类中被省略了。您可以查看Java 9的源代码来编写类似的代码。
PT
。将
H
替换为
hours
,依此类推。首先执行
S
以避免在其他两个单词中使用复数
s
。诚然,这是一种技巧,但由于运气好,因为字母的出现是小时-分钟-秒的英语拼写,所以它可以工作。
String output = remaining.toString()
.replace( "PT" , "" )
.replace( "S" , " seconds " )
.replace( "H" , " hours " )
.replace( "M" , " minutes " ) ;
ZonedDateTime
ZoneId
以获取
ZonedDateTime
对象。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
toString
。实际上,
ZonedDateTime
类通过将时区的名称附加在方括号中来扩展标准。
DateTimeFormatter
类的许多示例。
java.util.Date
Timer
类尚未更新为可与java.time类型一起使用。因此,通过添加到旧类中的新方法(在本例中为
Date
)转换回
from
对象。
java.util.Date date = java.util.Date.from( instantLater );
Duration
对象中的毫秒数。
long milliseconds = duration.toMillis() ;
ScheduledExecutorService
Timer
和
TimeTask
类。专为您的目的,
ScheduledExecutorService
。搜索堆栈溢出以获取许多示例和讨论。
java.util.Date
,
Calendar
和
SimpleDateFormat
。
Interval
,
YearWeek
,
YearQuarter
和
more。
关于java - 计时器倒数为负,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43175049/
如果我有一个变量 8589934592 示例: var a = (8589934592 | 0); //a is 0 var b = (8589934591223 | 0); //b
随着我们提高音阶,音符频率增加; #define A4 440 // These are the frequencies of the notes in herts #define A
我有一个这样组织的列表: [('down', 0.0098000000000000309), ('up', 0.0015000000000000568), ('down', 0.00890000000
如果我有一个多项式 P,有没有办法计算 P^-1 模 Q,即 Q 是另一个多项式?我知道这两个多项式的系数都属于以 z 为模的整数域,即 z 是一个整数。 我不确定 SymPy 是否已经在其 galo
对于给定的文件,我可以向后计算行数吗?即从 EOF 开始,计算行数直到开始? 我可以 fseek 到文件末尾。从那里开始,继续寻找新行字符(新行的指示)并继续增加我的 line_number 计数。但
有什么方法可以编写带除法的 C 代码来命令编译器在代码中需要常规除法精度的几个特定位置不使用快速除法(通过倒数数学),即使在全局允许倒数数学的情况下也是如此? 理想情况下,有一种方法不是特定于编译器的
我正在尝试将照片从我计算机上的本地文件导入到我的 HTML 文件中。我已经设法做到了,但它是按升序排列的。我尝试添加一个变量 JavaScript $(document).ready( functio
我正在尝试使用 commons-math 计算 2 尾学生分布的逆。我正在使用 Excel 来比较值并验证结果是否正确。 所以使用excel计算TINV,自由度为5,我使用95.45% =TINV(0
我有一个 jQuery 相机插件,它使用以下命令来拍摄快照。 这是它运行的代码。 function take_snapshot() { // take snapshot and get i
我刚刚学会了训练 brain.js network 并且只是在玩它。然后我很好奇是否可以采取相反的方式 - 从输出预测输入? 这是我的代码 const brain = require('brain.j
如果精度不重要,有什么方法可以提高速度的倒数(X 的除法 1)? 所以,我需要计算 1/X。是否有一些解决方法让我失去精度但做得更快? 最佳答案 𝗛𝗲𝗿𝗲𝗛𝗲𝗿𝗲𝗛𝗼𝘄𝗧𝗼?
令 N 为整数。如果N = 2536,则反转N为6352。如果N = 1000000,则反转N为1。 给定一个整数 M,其中 1 <= M <= 10^(100000)。 我们需要找到一个整数 N 是
我是一名优秀的程序员,十分优秀!