我正在添加这个问题,因为我是Java和Android的新手,我搜索了几个小时试图解决这个问题.答案来自相关答案的组合,所以我想我会记录我为其他可能正在努力的人学到的东西.见答案.
对于一些背景知识,我的经验主要是PHP的Web开发和一点Ruby.我唯一的操作系统是Linux(Ubuntu Studio),我(不情愿地)在Android Studio 2.1.2中开发我的第一个Android应用程序.我的Java设置如下:
>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud) datetime android android-gradle-plugin threetenbp threetenabp
我有2台不同的计算机,每台计算机都有不同的TimeZone.
在一台计算机上打印System.currentTimeMillis(),然后在两台计算机上打印以下命令:
System.out.println(new Date(123456));- > 123456代表currentTimeMillis计算机#1中的数字.
第二个打印(虽然键入硬编码)导致两台计算机中的打印不同.这是为什么?
我不需要整个故事来澄清我的问题,所以我只是展示代码(这只是一个例子).为什么我的结果有所不同?
码
long millis = 2305293L;
System.out.println(
millis + "ms = " +
(millis / 1000) + "s = " +
(millis / 1000 / 60) + "m");
System.out.println(
new SimpleDateFormat("HH:mm:ss").
format(
new Date(millis)
)
);
Run Code Online (Sandbox Code Playgroud)
产量
2305293ms = 2305s = 38m
01:38:25
Run Code Online (Sandbox Code Playgroud)
返回的时间和日期是正确的,除了小时,它比它应该小1小时.
我似乎设置了获得正确时间和日期所需的一切:
- I'm using Calendar.getInstance(), instead of new Date()
- I'm setting the timezone of the Calendar instance with Timezone.getTimeZone
- I'm using DateFormat and SimpleDateFormat to format the output
Run Code Online (Sandbox Code Playgroud)
我的时区是Eastern Standard Time,又名UTC/GMT-5:00.这些行都没有任何影响:
- cal.setTimeZone(TimeZone.getTimeZone(cal.getTimeZone().getDisplayName()));
- cal.setTimeZone(TimeZone.getTimeZone("EST"));
- cal.setTimeZone(TimeZone.getTimeZone("UTC"));
- cal.setTimeZone(TimeZone.getTimeZone("GMT"));
- cal.setTimeZone(TimeZone.getTimeZone("GMT-5:00"));
Run Code Online (Sandbox Code Playgroud)
...但是这些选项中的每一个都设定了我想要的时区.
Calendar实例添加了1小时:
PrintWriter output = null;
try {
output = new PrintWriter(
new BufferedWriter(new FileWriter("output.txt", true)));
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:ms MM/dd/yyyy");
Calendar cal = Calendar.getInstance();
// …Run Code Online (Sandbox Code Playgroud) System.out.println(new Date());
Thu Feb 23 04:57:57 ACT 2012
Run Code Online (Sandbox Code Playgroud)
我在main方法中运行它.我的系统当前时间是PKT.但它给了我ACT的时间.
任何的想法?如何获得正确的系统时间?

Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
c.set(2007, 0, 1);
System.out.println(c.getTime());
Run Code Online (Sandbox Code Playgroud)
输出:
Tue Sep 12 12:36:24 IST 2017
Mon Jan 01 12:36:24 IST 2007
但是,当我在不同的环境中使用相同的代码时,输出更改为:
输出:
Tue Sep 12 12:36:24 IST 2017
2007年1月1日星期一12:36:24 GMT
仅供参考,我尝试在设置值之前和之后打印日历实例的时区,两者都在"IST"中.
我想知道这个的根本原因.
尝试在 Date 中设置时区(我知道 Date 已弃用)
LOG.error(modifiedDate + "Date in service"); //Mon Sep 21 06:15:00 CDT 2020
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.ENGLISH);
format.setTimeZone(TimeZone.getDefault());
String dateString = format.format(modifiedDate);
LOG.error(dateString + " dateString"); //2020-09-21 06:15:00 -0500
Date date = format.parse(dateString);
LOG.error(date + " date after parsing"); //Mon Sep 21 06:15:00 CDT
Run Code Online (Sandbox Code Playgroud)
解析后时区没有改变,我错过了什么?
java ×6
date ×4
calendar ×2
datetime ×2
timezone ×2
android ×1
date-format ×1
gettime ×1
threetenabp ×1
threetenbp ×1