我有一些单元测试,希望'当前时间'与DateTime不同.现在我不想改变计算机的时间.
实现这一目标的最佳策略是什么?
有没有办法,无论是在代码中还是在JVM参数中,都可以覆盖当前时间,如System.currentTimeMillis手动更改主机上的系统时钟所示?
一点背景:
我们有一个系统可以运行许多会计工作,这些工作围绕当前日期(即本月的第一天,一年中的第一天等)展开大部分逻辑.
不幸的是,很多遗留代码都会调用诸如new Date()or之类的函数,这些函数Calendar.getInstance()最终都会调用System.currentTimeMillis.
出于测试目的,我们现在仍然需要手动更新系统时钟来操作代码认为运行测试的时间和日期.
所以我的问题是:
有没有办法覆盖返回的内容System.currentTimeMillis?例如,告诉JVM在从该方法返回之前自动添加或减去一些偏移量?
提前致谢!
在我的测试用例中,我需要测试时间敏感的方法,在那个方法中我们使用的是java 8类的LocalDate,它不是Joda.
当我正在进行测试时,我可以做些什么来改变时间
是否可以在Java中更改系统时间?
它应该在Windows和Linux下运行.我已尝试使用RuntimeClass,但权限存在问题.
这是我的代码:
String cmd="date -s \""+datetime.format(ntp_obj.getDest_Time())+"\"";
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(cmd);
Run Code Online (Sandbox Code Playgroud)
输出cmd是:
date -s "06/01/2011 17:59:01"
Run Code Online (Sandbox Code Playgroud)
但系统时间与以前相同.
我将设置时间,因为我正在编写NTP客户端,在那里我从NTP服务器获得时间并设置它.
我目前正在使用java编写许可证管理器,我将为我的应用程序指定开始日期和结束日期,以便我可以强制许可用户在一定时间后重新许可该程序.
但我面临的问题是,任何人都可以回滚他们的系统日期和时间,以保持许可证的有效性.在Java中是否有任何方法可以检测系统日期和时间是否已更改.我已经尝试过网络时间协议来从时间服务器获取当前日期和时间.
我想区分两个SYSTEMTIME变量.我之前看到有人问过这个问题,但他被告知要将两个SYSTEMTIME结构转换为FILETIME ..还有另一种方法可以解决这个问题吗?
SYSTEMTIME st;
GetSystemTime(&st);
Run Code Online (Sandbox Code Playgroud)
---这里的一些代码---
SYSTEMTIME st2;
GetSystemTime(&st2);
Run Code Online (Sandbox Code Playgroud)
ST-ST2?
我需要一些Ints作为随机数生成的种子,所以我想使用系统时间作为种子的旧技巧.
所以我尝试使用Data.Time包,我设法做了以下事情:
import Data.Time.Clock
time = getCurrentTime >>= return . utctDayTime
Run Code Online (Sandbox Code Playgroud)
当我运行时,我会得到以下内容:
Prelude Data.Time.Clock> time
55712.00536s
Run Code Online (Sandbox Code Playgroud)
类型time是IO DiffTime.我希望看到一个IO Something类型,因为这取决于程序外部的东西.所以我有两个问题:
a)是否有可能以某种方式解包IO并获取基础DiffTime值?
b)如何将DiffTime转换为整数值,以秒为单位?有一个功能,secondsToDiffTime但我找不到它的逆.
我想测量执行一些代码所需的系统时间.要做到这一点,我知道我会在两次调用getrusage()之间将所述代码夹在中间,但是我得到了一些意想不到的结果......
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct rusage usage;
struct timeval start, end;
int i, j, k = 0;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_stime;
for (i = 0; i < 10000; i++) {
/* Double loop for more interesting results. */
for (j = 0; j < 10000; j++) {
k += 20;
}
}
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_stime;
printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这会产生两个不同的数字,但唉!看到我的电脑想了一两秒后,这就是结果: …
我正在使用WPF/C#应用程序,我需要锁定用户在一段时间内访问特定功能.基本上,从某个事件发生的那一刻起,我想在接下来的24小时内阻止某些访问.
简单的案例:
都好.但是,用户可以更改系统时间,这对我来说很困难.他们可以提前24小时设置系统时间,我的应用程序将更加明智.
我假设在Windows中更改时间会进入系统的实时时钟......那么是否有任何独立于系统时钟的自由运行计时器?一个用户不能搞砸?
任何见解都表示赞赏.
我需要在Android应用程序中运行定期任务.我目前使用这样的计时器:
final Handler guiHandler = new Handler();
// the task to run
final Runnable myRunnable = new Runnable() {
@Override
public void run() {
doMyStuff();
}
};
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
guiHandler.post(myRunnable);
}
}, 0, 30000); // run every 30 seconds
Run Code Online (Sandbox Code Playgroud)
这正是我所需要的,但是有一个问题:如果我在模拟器或手机上更改时间,计时器将停止运行.这是我更改时间时日志中显示的内容:
D/SystemClock( 331): Setting time of day to sec=1278920137
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument
Run Code Online (Sandbox Code Playgroud)
没有关于计时器被中断的事情,但是在系统时钟改变之后它显然不再运行.只要应用程序正在运行,我就需要让任务始终保持运行.
如果它像这样停止,我怎么能重启计时器?Timer或TimerTask上没有方法来检查它是否正在运行,所以我不知道何时重新安排它.有任何想法吗?