在Java中将日期从UTC转换为EST?
我正在尝试将UTC的长时间戳转换为东部标准时间,我完全不知所措。任何提示都很好 时间格式应为:11/4/03 8:14 PM 提前谢谢在Java中将日期从UTC转换为EST?,java,Java,我正在尝试将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.u
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);
昨天我偶尔写了以下方法,可以帮助你:
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();
}
现在您只需格式化日期。为此使用SimpleDataFormat。以下是一个例子:
DateFormat format = new SimpleDateFormat("dd/MM/yy hh:mm a");
format.format(date);
您不应该考虑将日期转换为不同的时区。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):
或者,您可以在日历上设置时区,然后访问所需的日历字段。例如:
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"));
(这并没有给出您所要求的确切模式。)时区转换可能很棘手。您可能应该在时区表不断更新的地方使用(如果需要,可以手动更新) 使用Joda time非常简单:
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();
}
对于下面的时区,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()仍将打印默认/源时区字符串。时区utcTZ=TimeZone.getTimeZone(“UTC”);日历utcCal=Calendar.getInstance(utcTZ);utcCal.setTimeInMillis(utcAsLongValue);导入java.text.SimpleDateFormat;导入java.util.Date;SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd HH:MM:ss-zzz”);sdf.setTimeZone(utcTZ);Date-utcDate=utcCal.getTime();sdf.formatDate(utcDate);请将其添加到您的答案中,并尝试保持其格式,没有人会以这种方式读取它。可能的副本请尝试此操作,并查看是否正确地“转换”到EST(UTC-5):
System.err.println(新的SimpleDateFormat(”yy/M/dd hh:mm a z”).格式(shiftTimeZone(新日期(),TimeZone.getTimeZone(“GMT”),TimeZone.getTimeZone(“EST”));
。它无法正常工作。它无法从当前GMT时间打印正确的EST时间。它打印的时间比EST晚2小时。您尝试过吗?
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);
}