java 设置本地时间,如何使用java中的当前和本地夏令时以及时区信息将joda LocalDateTime对象设置为指定时间...

我正在尝试创建一个java.sql.Time对象来查询SQL数据库中的时间类型,但我正在使用joda来解析我收到的字符串.

我尝试过几种不同的方法.这是我最近的一次.

protected Time startTime = null;

protected static final String dateFormat = "HH:mm:ssZ";

protected static final DateTimeFormatter formatter = DateTimeFormat.forPattern(dateFormat);

public TimeBetweenFilter(String fieldName, String type, String value) {

super(fieldName, type, value);

String [] times = value.split("\\|");

if(times.length == 2 && !times[0].isEmpty() && !times[1].isEmpty()){

try{

LocalDateTime current = LocalDateTime.now();

LocalDateTime timeFromEpoch= new LocalDateTime(formatter.parseDateTime(times[0]));

startTime = new Time(timeFromEpoch.withDate(current.getYear(), current.getMonthOfYear(), current.getDayOfMonth()).toLocalTime().toDateTimeToday().getMillis());

}catch (Exception e){

...

}

但输出总是比收到的输入落后1小时.例如,如果输入是UTC的10:30:00,则startTime应该是当地时间的4:30:00.但相反,我得到3:30.

解决了

DateTime beginning = new DateTime(DateTimeZone.UTC).toDateMidnight().toDateTime().plus(DateTime.parse(times[0], formatter).getMillis());

startTime = new Time(beginning.getMillis());

创建一个新日期,今天早上午夜,时区UTC,然后以毫秒为单位添加UTC时间.然后它被转换为java.sql.Time对象.

解决方法:

LocalDateTime在逻辑上不具有任何时区或DST信息.这就是重点 – 它是“本地的”而不是任何特定的时区.不同时区的两个人可能都在同一个当地日期/时间醒来,但这并不意味着他们是同一时刻.

如果您需要包含时区的类型,则应使用DateTime.

编辑:好的,一种方法是采取“今天在本地时区”,解析时间到LocalTime,结合两个形成一个LocalDateTime,将其转换为UTC的DateTime,然后将该DateTime转换为本地时区代替.困难在于结束日期可能不一样,在这种情况下,您可能需要添加或减去一天.然后,由于DST的变化,这可能会改变时间,这使得它更难.可能会有令人讨厌的角落案件需要考虑.

虽然开始时你的要求很奇怪 – 只有一个UTC时间,你想在当地时区的日期/时间使用它是很奇怪的.也许如果你提供更多的背景,那将有所帮助.

标签:java,mysql,jodatime,datetime-parsing

来源: https://codeday.me/bug/20190629/1325557.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值