java时间转换,带时区的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java时间转换,带时区的相关的知识,希望对你有一定的参考价值。
现在我有一个时间类型是带时区的,“Fri Jan 17 11:14:45 CST 2014” 想把他转换成北京时间, 转了以后的时间类型是“yyyy-MM-dd HH:mm:ss”
望大神指点迷津
我假设了你的已知时间类型为Calendar,如果不是你也可以自己改成Date类型,代码如下:
import java.text.DateFormat;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
public class Test
public static void main(String[] args)
//假如这个是你已知的时间类型
Calendar cal = Calendar.getInstance();
cal.getTimeInMillis();
//北京时区GMT+8
Calendar beijingcal = Calendar.getInstance();
beijingcal.clear();
beijingcal.setTimeZone(TimeZone.getTimeZone("GMT+8"));
beijingcal.setTimeInMillis(cal.getTimeInMillis());
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String beijingFormatStr = fmt.format(beijingcal.getTime());
System.out.println(beijingFormatStr);
参考技术A new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());追问
明显不嘛。。。
参考技术B String dateString = "Fri Feb 01 00:00:00 GMT+08:00 2013";SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.US);
TimeZone tz = TimeZone.getTimeZone("GMT+8");
sdf.setTimeZone(tz);
String str = sdf.format(Calendar.getInstance().getTime());
System.out.println(str);
Date s;
try
s = sdf.parse(dateString);
sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(s));
catch (ParseException e)
// TODO Auto-generated catch block
e.printStackTrace();
参考技术C DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = fmt.format(new Date(System.currentTimeMillis()));System.out.println(time); 参考技术D 去google百度一下,哈哈
Java - 日期时区转换
【中文标题】Java - 日期时区转换【英文标题】:Java - Date timezone conversion 【发布时间】:2019-10-24 22:53:00 【问题描述】:我正在尝试将 JSON 对象转换为日期并将其写入数据库。但是,将日期转换为 EST
的代码不起作用。将日期转换为 EST
的最佳方法是什么?
JSON 条目
"custom_date_1": "2019-05-19","
转换代码
int id;
Date trainingDate;
SimpleDateFormat format = new SimpleDateFormat("DD-MM-YY", Locale.US);
TimeZone tz = TimeZone.getTimeZone("EST");
format.setTimeZone(tz);
logger.info("custom_date_1: ", object.getString("custom_date_1"));
try
id= Integer.parseInt(object.getString("employee_number"));
trainingDate = format.parse(object.getString("custom_date_1"));
//Still says GMT
logger.info("trainingDate: ", trainingDate);
map.put("employee_number", id);
map.put("custom_date_1", trainingDate);
catch (ParseException e)
e.printStackTrace();
日志声明
2019-06-10 14:00:00,226 INFO custom_date_1: 2019-05-19
2019-06-10 14:00:00,226 INFO trainingDate: Sun Dec 30 05:00:00 GMT 2018
【问题讨论】:
当您有一个没有时间的日期时,在特定时区要求它有什么意义? 任何日期都是特定时区中的同一日期。所以你可以用LocalDate.parse(date);
把它转换成日期?
当您说“EST”时,您的真正意思是“东部标准时间”(纽约冬季观察到的 UTC 偏移量),还是您的意思是“纽约时区”?如果是前者,则表示为UTC+5
;如果是后者,表示为America/New_York
。 (“EST”实际上是前者)。
我建议你不要使用Date
、SimpleDateFormat
和TimeZone
。那些课程设计糟糕且过时,尤其是中间的课程出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDate
(乍一看,在我看来你不需要任何其他类)。
@P.Soutzikevich 不,不是重复的。 That Question 是关于时间的日期,而这个问题似乎是关于仅日期的(虽然不清楚)。
【参考方案1】:
tl;博士
myPreparedStatement.setObject( // In JDBC 4.2 and later, exchange *java.time* objects with your database. Use `PreparedStatement` to avoid SQL Injection attacks.
… , // Specify which `?` placeholder to replace in your SQL statement.
LocalDate.parse( "2019-05-19" ) // Parse your standard ISO 8601 formatted input string as a date-only value represented in the `LocalDate` class.
)
详情
“custom_date_1”:“2019-05-19”,
您的输入字符串是标准的ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用这些标准格式。所以不需要指定格式模式。
LocalDate ld = LocalDate.parse( "2019-05-19" ) ;
时区在这里无关紧要。所以你的问题很混乱。
我正在尝试将 JSON 对象转换为日期并将其写入数据库。
截至JDBC 4.2,我们可以与数据库交换java.time 对象。您在数据库中为这个仅日期值(没有时间和没有时区)的列应该是类似于标准 SQL 类型DATE
的类型。
myPreparedStatement.setObject( … , ld ) ;
检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
【讨论】:
【参考方案2】:从 Java 8 开始,您应该使用 LocalDate
和 LocalDateTime
,因此您可以使用进行时区转换
LocalDateTime.atZone(ZoneId zoneId)
例如
LocalDateTime date = LocalDateTime.parse("2019-06-10T12:00:00");
ZonedDateTime date2 = date.atZone(ZoneId.systemDefault());
【讨论】:
以上是关于java时间转换,带时区的的主要内容,如果未能解决你的问题,请参考以下文章