使用此C代码:
int a = time(NULL);
_daylight = 0;
_timezone = 0;
int b = time(NULL);
assert(a != b);
“a”和“b”将具有不同的值(并且不仅仅因为它们被称为相隔几毫秒)。不同之处在于PC时区与UTC时间的偏移量。此外,更改_daylight和_timezone值会影响我在我的C应用程序中可能使用的所有其他函数 - 我假设因为它们都尊重该值。
在Java上是否有类似的东西,或者Android OS上的Java专用?我尝试了TimeZone.setDefault(),但是这并没有改变System.currentTimeMillis()返回的值,所以我认为它不会像C变量那样具有“全局”效果。
我知道System.currentTimeMillis()与time()不同,因为它“always”返回自now和epoch以来的millis数,而time()函数允许你获得“false”(fudged)根据您可以设置的这些全局变量调整的值。
尝试在Android操作系统上模拟旧版C应用。它清除那些_timezone和_daylight值,这几乎意味着它忽略了任何时区。因此,如果在西海岸运行应用程序的用户进入下午3点的时间,然后他们更改了他们的时区设置,或者在est海岸上的用户查看该项目,它仍将显示为下午3点。
我知道我可以使用Calendar对象和其他方法来确保我做正确的转换,但我宁愿只有一个简单的“我不关心时区”设置,就像我在C应用程序中所做的那样那真的不用担心它们。
编辑:我仍然想听听我有哪些其他选项,但是现在我想出了这个Java代码,我会尽力使用任何需要模仿C app的代码:
// IMPORTANT: Use this function everywhere a Calendar object is needed, instead of calling
// Calendar.getInstance() directly. This returns the correct kludged time that matches
// what our PC application uses (_daylight=0, _timezone=0, time(NULL) in C)
public static Calendar GetCalendarInstance()
{
// Get the current UTC time
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
// Offset it by the system time zone offset.
// This mimics what the C time(NULL) function does when you set _timezone=0 and _daylight=0
cal.add(Calendar.MILLISECOND, TimeZone.getDefault().getOffset(cal.getTimeInMillis()));
return(cal);
}
另外,我确实已经在我的Android应用中找到了一个我需要真实的,未调整的系统时间(当使用AlarmManager来安排PendingIntent时)。所以我认为“全球”无论如何都可能是危险的。我仍然认为95%的代码会使用模仿C应用程序的版本,所以如果可能的话我想默认为那个,然后只需要对其他几个地方进行特殊处理。