好的,所以我几乎尝试了一切。我打赌这是非常简单的事情,但我似乎无法掌握它。
服务器发给我时间,这是时代。但是,当我将它放入日期对象时,它似乎会自动选择时区,并且它会在服务器时间增加+3。因此,如果gmt时间是00.00,则表示其为03.00。
我还需要添加自己的时区。假设纪元时间再次为00.00,我添加时区后应该读取10.00。
任何帮助将不胜感激。谢谢
答案 0 :(得分:1)
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
另外,下面引用的是来自 home page of Joda-Time 的通知:
<块引用>请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。
使用 java.time
(现代日期时间 API)的解决方案:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
long millis = 1316391494L;
Instant instant = Instant.ofEpochMilli(millis);
System.out.println(instant);
// The same instant at a specific timezone
ZonedDateTime zdt = instant.atZone(ZoneId.of("Australia/Brisbane"));
System.out.println(zdt);
}
}
输出:
1970-01-16T05:39:51.494Z
1970-01-16T15:39:51.494+10:00[Australia/Brisbane]
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
java.util.Date
对象仅表示时间轴上的一个瞬间 — 自 UNIX 时代(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来毫秒数的包装器。由于它不保存任何时区信息,它的 toString
函数应用 JVM 的时区返回一个 String
格式,EEE MMM dd HH:mm:ss zzz yyyy
,从这个 毫秒值。要以不同的格式和时区获取 String
对象的 java.util.Date
表示,您需要将 SimpleDateFormat
与所需的格式和适用的时区一起使用,例如
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
long millis = 1316391494L;
Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX[zzzz]", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String strDateUtc = sdf.format(date);
System.out.println(strDateUtc);
sdf.setTimeZone(TimeZone.getTimeZone("Australia/Brisbane"));
String strDateBrisbane = sdf.format(date);
System.out.println(strDateBrisbane);
}
}
输出:
1970-01-16T05:39:51.494Z[Coordinated Universal Time]
1970-01-16T15:39:51.494+10:00[Australian Eastern Standard Time]
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 1 :(得分:0)
“它似乎添加了” - 我怀疑你正在使用确实使用本地时区的Date.toString()
。 Date
对象本身实际上是UTC。使用DateFormat
代替执行转换为字符串,您可以指定要使用的时区。您可能还需要使用Calendar
- 这取决于您要做的事情。
(或者,首先使用Joda Time,这是一个更好的API。虽然对于您的Android项目可能有点笨重。如果有“Joda Time lite”,我不会感到惊讶为某种东西投射某个地方......)
编辑:快速样本,虽然不完全清楚你需要什么......
long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(customTimeZone);
String formatted = format.format(date);