从日期开始的本地时间
LocalTime from Date
我正在尝试将 Date
实例转换为 LocalTime
实例。
// Create the Date
Date date = format.parse("2011-02-18 05:00:00.0");
// Convert to Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// Convert Calendar to LocalTime
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis());
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
我没有收到编译器错误,但 LocalTime
实例值是错误的。
我认为它不起作用,因为 Date
将时间存储在 fasttime
而不是 cdate
。
我正在使用 JDK 版本 1.8。
您的输入实际上是 LocalDateTime
。简单地将其解析为 LocalDateTime
然后从中获取 LocalTime
会简单得多。无需担心时区,没有遗留问题 类(尽可能避免 Date
和 Calendar
...)
import java.time.*;
import java.time.format.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US);
String text = "2011-02-18 05:00:00.0";
LocalDateTime localDateTime = LocalDateTime.parse(text, formatter);
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);
}
}
试试这个
String datestring = "2011-02-18 05:00:00.0";
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//take a look at MM
Date date = dt.parse(datestring );
Instant instant = Instant.ofEpochMilli(date.getTime());
LocalTime res = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
这也很简单:
LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(),
ZoneId.systemDefault()).toLocalTime();
是正确的。这个答案扩展了这些想法。
避免遗留日期时间类
其他一些答案和问题,将旧的遗留日期时间 类 与新的混合在一起。这是不必要的和不好的做法。 java.time 类 的全部意义在于 替换 麻烦且令人困惑的旧 类.
- 您不需要
java.util.Date
。
- 你 不需要
java.util.Calendar
。
LocalDateTime
您输入的字符串缺少任何关于与 UTC 的偏移量或时区的信息。所以我们将它解析为一个 LocalDateTime
对象。
为了解析,我们将中间的 SPACE 替换为 T
以符合日期时间格式的 ISO 8601 标准。
String input = "2011-02-18 05:00:00.0".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
LocalTime
要关注没有日期的时间,请请求 LocalTime
。
LocalTime lt = ldt.toLocalTime();
ZonedDateTime
请注意,其中 none 是实际时刻,而不是时间轴上的一个点。如果没有与 UTC 的偏移量或时区的上下文,我们不知道您是指新西兰奥克兰的凌晨 5 点或印度加尔各答的凌晨 5 点,还是法国巴黎的凌晨 5 点或魁北克蒙特利尔的凌晨 5 点。每一个都是非常不同的时刻。
如果根据上下文您确实知道预期的时区,请应用它。应用 ZoneId
to get a ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
如果需要,请从那里索要 LocalTime
。
LocalTime lt = zdt.toLocalTime();
Instant
如果您想在 UTC, extract an Instant
. The Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds 中看到相同的时刻(最多九 (9) 位小数)。
通常最好在您的大部分业务逻辑、日志记录、数据存储和数据交换中关注 UTC。学会将 UTC 视为“唯一真实时间”。
Instant instant = zdt.toInstant(); // Same moment, shifted to UTC.
我正在尝试将 Date
实例转换为 LocalTime
实例。
// Create the Date
Date date = format.parse("2011-02-18 05:00:00.0");
// Convert to Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// Convert Calendar to LocalTime
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis());
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
我没有收到编译器错误,但 LocalTime
实例值是错误的。
我认为它不起作用,因为 Date
将时间存储在 fasttime
而不是 cdate
。
我正在使用 JDK 版本 1.8。
您的输入实际上是 LocalDateTime
。简单地将其解析为 LocalDateTime
然后从中获取 LocalTime
会简单得多。无需担心时区,没有遗留问题 类(尽可能避免 Date
和 Calendar
...)
import java.time.*;
import java.time.format.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US);
String text = "2011-02-18 05:00:00.0";
LocalDateTime localDateTime = LocalDateTime.parse(text, formatter);
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);
}
}
试试这个
String datestring = "2011-02-18 05:00:00.0";
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//take a look at MM
Date date = dt.parse(datestring );
Instant instant = Instant.ofEpochMilli(date.getTime());
LocalTime res = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
这也很简单:
LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(),
ZoneId.systemDefault()).toLocalTime();
避免遗留日期时间类
其他一些答案和问题,将旧的遗留日期时间 类 与新的混合在一起。这是不必要的和不好的做法。 java.time 类 的全部意义在于 替换 麻烦且令人困惑的旧 类.
- 您不需要
java.util.Date
。 - 你 不需要
java.util.Calendar
。
LocalDateTime
您输入的字符串缺少任何关于与 UTC 的偏移量或时区的信息。所以我们将它解析为一个 LocalDateTime
对象。
为了解析,我们将中间的 SPACE 替换为 T
以符合日期时间格式的 ISO 8601 标准。
String input = "2011-02-18 05:00:00.0".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
LocalTime
要关注没有日期的时间,请请求 LocalTime
。
LocalTime lt = ldt.toLocalTime();
ZonedDateTime
请注意,其中 none 是实际时刻,而不是时间轴上的一个点。如果没有与 UTC 的偏移量或时区的上下文,我们不知道您是指新西兰奥克兰的凌晨 5 点或印度加尔各答的凌晨 5 点,还是法国巴黎的凌晨 5 点或魁北克蒙特利尔的凌晨 5 点。每一个都是非常不同的时刻。
如果根据上下文您确实知道预期的时区,请应用它。应用 ZoneId
to get a ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
如果需要,请从那里索要 LocalTime
。
LocalTime lt = zdt.toLocalTime();
Instant
如果您想在 UTC, extract an Instant
. The Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds 中看到相同的时刻(最多九 (9) 位小数)。
通常最好在您的大部分业务逻辑、日志记录、数据存储和数据交换中关注 UTC。学会将 UTC 视为“唯一真实时间”。
Instant instant = zdt.toInstant(); // Same moment, shifted to UTC.