Java 将字符串日期转换为历元时间时出现意外值?
下面给出:Java 将字符串日期转换为历元时间时出现意外值?,java,Java,下面给出:147502087500。当我将此历元转换回人类可读的时间戳时,我得到:Wed,2016年9月28日00:01:15 GMT,这与初始日期不同 String date = "2016-09-27 20:01:15.0"; DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long epoch = df.parse(date).getTime(); System.out.println(epoch); 在这里工作
147502087500
。当我将此历元转换回人类可读的时间戳时,我得到:Wed,2016年9月28日00:01:15 GMT
,这与初始日期不同
String date = "2016-09-27 20:01:15.0";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long epoch = df.parse(date).getTime();
System.out.println(epoch);
在这里工作得很好:
package stackoverflow;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Programa {
public static void main(String[] args) throws ParseException {
String date = "2016-09-27 20:01:15.0";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long epoch = df.parse(date).getTime();
System.out.println(epoch);
Date d = new Date(epoch);
String out = df.format(d);
System.out.println(out);
}
}
你肯定忘了考虑要使用的时区。如果您没有定义它,则采用默认值(来自JVM),例如,根据您的服务器不同,可能会有所不同。请尝试
LocalDateTime
String date = "2016-09-27 20:01:15";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long epoch = df.parse(date).getTime();
System.out.println(epoch);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
LocalDateTime ld = LocalDateTime.parse(date, formatter);
long epoch2 = ld.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
System.out.println(epoch2);
Instant in = Instant.ofEpochMilli(epoch2);
LocalDateTime ldt = LocalDateTime.ofInstant(in, ZoneId.systemDefault());
System.out.println(ldt);
输出
1474986675000
1474986675000
2016-09-27T20:01:15
您应该为输入和输出指定时区。在使用format方法之前,可以使用“z”实例化SimpleDataFormat和setTimeZone:
package stackoverflow;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Programa {
public static void main(String[] args) throws ParseException {
String date = "2016-09-27 20:01:15 GMT";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
long epoch = df.parse(date).getTime();
System.out.println(epoch);
Date d = new Date(epoch);
df.setTimeZone(TimeZone.getTimeZone("GMT"));
String out = df.format(d);
System.out.println(out);
}
}
对于可用时区,请尝试TimeZone.getAvailableIDs(),因为它是使用EDT输入的,但使用GMT输出的。在没有明确时区的情况下,永远不要进行时间戳转换。这是一场势均力敌的竞争。