你还记得“软件真的好难做”中的那个有意思的例子吗?那个例子告诉我们软件开发中假设可能会是致命的事。今天,我又在StackOverflow上看到一个关于时间的问题——为什么1927年12月31日的午夜时间这么奇怪?提问题的这个人给了下面的一段java代码(我做一些修改,保证让你可以copy过去就可以编译运行)
我在其中高亮了两行,这个程序就是想比较一下“1927-12-31 23:54:07” 和 “1927-12-31 23:54:08”差几秒,很明显,是差一秒。但是程序的输出却不是这样的。
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;class time{
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime()/1000;
long ld4 = sDt4.getTime()/1000;
System.out.println(ld3);
System.out.println(ld4);
System.out.println(ld4-ld3);
}
}
下面,让我们来看看程序的输出:(是的,差出353秒钟来)
-1325491905
-1325491552
353
Stackoverflow真的很强大,在大家要求发问者给出时区(中国上海)的15分钟内就解决了这个问题。相当的令人惊叹。原因是什么呢?大家需要围观一下这个网页。(为了怕被墙或是被和谐,我已习惯了抓屏保存,如果有人能开发一个软件能随看随抓,然后如果源被删了可以P2P的从已下载了的人那里获取,那么这个软件应该会很有国内市场。蛋扯远了,Sorry)
从上图中我们可以看到——在1927年12月31日23:59:59时,往后面的一秒应该是1928年1月1日 0:0:0,但是这个时间被往后调整了5分52秒,而成了,1927年12月31日的,23:54:08,于是,完成了352秒的穿越。于是我们的Java程序出了这样的一个问题,这真是一个奇迹。
为什么会有这个调整呢?我居然Google不到,不过,我在这个timeanddate.com上查看了一下北京的时间,发现北京的时间只到1970年,于是我猜想,中国近代历史乱七八糟的政权交替可能是这个原因。于是我看了一下北京和上海物理时差,果然,北京上海的时差在5分50秒左右。因此,我觉得这个时间的变化应该是从上海时间变成了北京时间。至于你信不信,反正我是信了。
从这个事,我得到下面的一些启示:
- Java在的时区实现相当的强大啊。这种细节都能考虑到。
- 本地时间的完全就是一锅,应该尽量不用。
- 如果你要开发和时区有关系的程序,你的系统里一定要使用GMT标准时间,仅在显示的时候才转成本地时间。
各位无证程序员们,看到这个例子,你们是不是感到编程的压力了?呵呵。
系统在内部使用通用协调时间或 UTC 基于时间时, 应用程序通常显示在本地时间或日期和您的时区的时间。 但是,开发人员有时可能需要以编程方式从 UTC (以前称为格林威治标准时间或 GMT) 时间转换为本地时间。
这种转换可以通过使用以下的 Win 32 函数中来完成:
While the system uses Universal Coordinated Time or UTC-based time internally, applications generally display the local time, or the date and time of day for your time zone. However, a developer occasionally may need to programmatically convert from UTC (previously referred to as Greenwich Mean time or GMT) time to local time.
This conversion can be done by using the following Win32 functions:
// Converting UTCTime to LocalTime. FILETIME FileTime, LocalFileTime; SYSTEMTIME UTCTime, LocalTime; SystemTimeToFileTime(&UTCTIme,&FileTime); FileTimeToLocalFileTime(&FileTime, &LocalFileTime); FileTimeToSystemTime(&LocalFileTime, &LocalTime);
夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
在 Visual C++ 6.0 中处理本地时间与 UTC 时间的转换涉及到使用 Windows API 函数。Visual C++ 6.0 是一个较旧的 IDE,它使用 C++ 编程语言,并且通常与 Windows API 结合使用。下面是如何在 VC6.0 中声明本地时间和 UTC 时间,并在两者之间进行转换的方法:
### 声明本地时间和 UTC 时间
在 VC6.0 中,你通常会使用 `SYSTEMTIME` 或者 `FILETIME` 结构来存储时间。不过,更常见的做法是使用 `time_t` 类型和 `tm` 结构来处理本地时间和 UTC 时间。
#### 使用 `time_t` 和 `tm` 结构:
1. **声明本地时间**:
```cpp
time_t localTimeRaw;
struct tm* localTimeInfo;
```
2. **声明 UTC 时间**:
```cpp
time_t utcTimeRaw;
struct tm* utcTimeInfo;
```
### 在本地时间和 UTC 时间之间转换
#### 从本地时间转换到 UTC 时间:
1. 获取本地时间:
```cpp
time(&localTimeRaw);
localTimeInfo = localtime(&localTimeRaw);
```
2. 将本地时间转换为 UTC 时间:
```cpp
utcTimeInfo = gmtime(&localTimeRaw);
```
#### 从 UTC 时间转换到本地时间:
1. 获取 UTC 时间:
```cpp
time(&utcTimeRaw);
utcTimeInfo = gmtime(&utcTimeRaw);
```
2. 将 UTC 时间转换为本地时间:
```cpp
localTimeInfo = localtime(&utcTimeRaw);
```
#### 使用 Windows API 函数进行转换:
对于更高级的功能,如处理 `SYSTEMTIME` 或 `FILETIME`,你可能需要使用 Windows API 函数,如 `SystemTimeToFileTime`、`FileTimeToSystemTime`、`SystemTimeToTzSpecificLocalTime` 和 `SystemTimeToUniversalTime` 等。
例如,从本地时间转换到 UTC 时间:
```cpp
SYSTEMTIME localSysTime;
GetLocalTime(&localSysTime);
SYSTEMTIME utcSysTime;
SystemTimeToUniversalTime(&localSysTime, &utcSysTime);
```
从 UTC 时间转换到本地时间:
```cpp
SYSTEMTIME utcSysTime;
GetSystemTime(&utcSysTime);
SYSTEMTIME localSysTime;
SystemTimeToLocalTime(&utcSysTime, &localSysTime);
```
请注意,使用 `time_t` 和 `tm` 结构进行时间转换是跨平台的,而使用 Windows API 函数则仅适用于 Windows 平台。
最后,不要忘记包含必要的头文件,例如 `<time.h>` 和 `<windows.h>`。
```cpp
#include <time.h>
#include <windows.h>
```
这样,你就可以在 VC6.0 中处理本地时间和 UTC 时间,并在它们之间进行转换了。
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.