请建议一种在美国东部时间打印日期的方法。
public Date convertToEST(Date date)
{
// some code here
}
如果我在IST中传入日期,该方法应该在EST中返回该日期。
答案 0 :(得分:4)
“方法应该在EST中返回该日期”的想法是错误的。自1970年1月1日00:00:00 GMT起,日期仅为毫秒数。它与时区无关。
答案 1 :(得分:3)
您需要以下
Date date = new Date();
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
// Set the formatter to use a different timezone
formatter.setTimeZone(TimeZone.getTimeZone("EST"));
// Prints the date in the EST timezone
System.out.println(formatter.format(date));
要使方法返回Date
对象,您需要如下所示
public static Date convertToEST(Date date) throws ParseException {
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("EST"));
return formatter.parse((formatter.format(date)));
}
Javadoc- DateFormat.format
,DateFormat.parse
答案 2 :(得分:2)
更改java中的时区
public class TimeZoneSample {
public static void main(String[] args) throws ParseException {
// I am in IST time Zone (Its ID is Asia/Calcutta or ITS)
System.out.println(TimeZone.getDefault());
// I get Indian Time printed
System.out.println(new Date());
System.out.println("-------------------");
// I am setting the time zone to China
TimeZone.setDefault(TimeZone.getTimeZone("CTT"));
// Now my default time zone is in China
System.out.println(TimeZone.getDefault());
// I get Chian Time printed
System.out.println(new Date());
System.out.println("-------------------");
// I am setting the time zone to EST
TimeZone.setDefault(TimeZone.getTimeZone("EST"));
// Now my default time zone is in EST
System.out.println(TimeZone.getDefault());
// I get Eastern Time printed
System.out.println(new Date());
}
}
控制台输出
sun.util.calendar.ZoneInfo[id="Asia/Calcutta",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
Wed Dec 26 10:22:25 IST 2012
-------------------
sun.util.calendar.ZoneInfo[id="CTT",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
Wed Dec 26 12:52:25 CST 2012
-------------------
sun.util.calendar.ZoneInfo[id="EST",offset=-18000000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
Tue Dec 25 23:52:25 EST 2012
答案 3 :(得分:1)
myJavaUtilDate // Avoid the troublesome legacy date-time classes.
.toInstant() // Convert from legacy class to modern class `Instant`, always in UTC by definition.
.atZone( // Adjust into a time zone. Same moment, different wall-clock time.
ZoneId.of( “America/New_York” ) // Never use “EST”/“IST” pseudo-zones. Use proper continent/region names.
) // Yields a `ZonedDateTime` object.
Instant
,而不是Date
其他答案使用麻烦的旧遗留日期时间类。几年前, java.time 类取代了这些。忘记java.util.Date
,这是一个设计糟糕的课堂。
如果我在IST中传递日期,
不要!
学习思考,工作,交换和登录UTC值。在作为程序员或管理员的工作中忘记自己的狭隘时区。将UTC视为 One True Time ,所有其他区域仅仅是变化。
java.time中的构建块是Instant
类。此类表示一个时刻,即UTC时间轴上的一个点。内部表示自UTC 1970年以来的秒数加纳秒。
Instant instant = Instant.now() ; // Capture current moment in UTC.
一般来说,这些Instant
对象是您应该传递给代码的对象。仅在业务逻辑或用户界面需要时调整为时区。
切勿使用媒体中经常看到的3-4个字母伪区域,例如“IST”或“EST”。相反,请使用定义为continent/region
的正确时区名称,例如Europe/Paris
或Asia/Kolkata
或America/New_York
。
ZoneId z = ZoneId.of( “America/New_York” ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
如果必须序列化为文本以交换日期时间值,请使用标准ISO 8601格式。默认情况下,这些方法在java.time toString
和parse
方法中使用。
要以其他格式生成字符串,请参阅DateTimeFormatter
类。
要与尚未更新为 java.time 的旧代码互操作,请调用添加到旧类的新转换方法。
Date
表示UTC时刻,因此它会直接映射到Instant
。
Instant instant = myJavaUtilDate.toInstant() ;
和...
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;
旧版GregorianCalendar
映射到现代ZonedDateTime
。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
使用符合JDBC driver或更高版本的JDBC 4.2,您可以直接与数据库交换 java.time 对象。不需要字符串也不需要java.sql。* classes。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 4 :(得分:0)
DateFormat requiredDateFormat = new SimpleDateFormat("hh:mm a zzz, EEE MMMM dd,yyyy");
requiredDateFormat.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
String date = requiredDateFormat.format(new Date());
System.out.println(date);
控制台输出:美国东部时间上午06:25,即2月13日星期二,