我正在尝试将UTC的长时间戳转换为东部标准时间并完全丢失。任何提示都会很棒!
时间格式应为:11/4/03 8:14 PM 提前谢谢!
TimeZone utcTZ= TimeZone.getTimeZone("UTC");
Calendar utcCal= Calendar.getInstance(utcTZ);
utcCal.setTimeInMillis(utcAsLongValue);
import java.text.SimpleDateFormat;
import java.util.Date;
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz");
sdf.setTimeZone(utcTZ);
Date utcDate= utcCal.getTime();
sdf.formatDate(utcDate);
答案 0 :(得分:6)
昨天我偶尔会写下以下方法来帮助你:
private Date shiftTimeZone(Date date, TimeZone sourceTimeZone, TimeZone targetTimeZone) {
Calendar sourceCalendar = Calendar.getInstance();
sourceCalendar.setTime(date);
sourceCalendar.setTimeZone(sourceTimeZone);
Calendar targetCalendar = Calendar.getInstance();
for (int field : new int[] {Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}) {
targetCalendar.set(field, sourceCalendar.get(field));
}
targetCalendar.setTimeZone(targetTimeZone);
return targetCalendar.getTime();
}
现在你只需要格式化日期。为此使用SimpleDateFormat。这是一个例子:
DateFormat format = new SimpleDateFormat("dd/MM/yy hh:mm a");
format.format(date);
答案 1 :(得分:6)
您不应该考虑将日期转换为不同的时区。 Java中的日期是,并且应该始终是UTC。
相反,您可以在格式化日期时设置特定时区。这是一个例子:
public static void main(String[] args) throws Exception {
String tzid = "EST";
TimeZone tz = TimeZone.getTimeZone(tzid);
long utc = System.currentTimeMillis(); // supply your timestamp here
Date d = new Date(utc);
// timezone symbol (z) included in the format pattern for debug
DateFormat format = new SimpleDateFormat("yy/M/dd hh:mm a z");
// format date in default timezone
System.err.println(format.format(d));
// format date in target timezone
format.setTimeZone(tz);
System.err.println(format.format(d));
}
我的输出(我的默认时区是GMT):
11/12/19 10:06 AM GMT
11/12/19 05:06 AM EST
或者,您可以在日历上设置时区,然后访问所需的日历字段。例如:
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTimeInMillis(utc);
System.err.printf("%d/%d/%d %d:%d %s\n", c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.HOUR), c.get(Calendar.MINUTE), (c.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM"));
(这不会为您提供您所要求的确切模式。)
答案 2 :(得分:2)
时区转换可能很棘手。您应该使用Joda Time,其中时区表会不断更新(并且可以根据需要手动更新
)使用Joda时间非常简单:
public static Date convertJodaTimezone(LocalDateTime date, String localTimeZone, String destTimeZone) {
DateTime srcDateTime = date.toDateTime(DateTimeZone.forID(localTimeZone));
DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID(destTimeZone));
return dstDateTime.toLocalDateTime().toDateTime().toDate();
}
来自以下table
的时区答案 3 :(得分:1)
引擎盖下Java将日期值保持为UTC毫秒,所以我认为只有通过操纵这些毫秒来改变价值的方法,例如。
private void getShiftedDate(Date date, TimeZone targetZone) {
long sourceMillies = TimeUnit.MILLISECONDS.toMillis(TimeZone.getDefault().getRawOffset());
long targetMillies = TimeUnit.MILLISECONDS.toMillis(targetZone.getRawOffset());
long newMillies = date.getTime() + (targetMillies - sourceMillies);
Date shiftedDate = new Date(newMillies);
System.out.println("shifted => " + shiftedDate);
}
但是,shiftedDate的toString()仍将打印默认/源时区字符串。