将XMLGregorianCalendar转换为LocalDateTime时出现奇怪的结果

时间:2019-09-06 00:51:01

标签: java time localdate xmlgregoriancalendar

我正在尝试将XMLGregorianCalendarObject转换为LocalDateTime,并且得到了异常的结果。 我已经尝试过Link to codethis post中的解决方案。

我在这里做一些假设,可能是我错了:

1)xmlDate参数为UTC

2)返回值为PST

private LocalDateTime convertDate(XMLGregorianCalendar xmlDate) {

   GregorianCalendar gc = xmlDate.toGregorianCalendar();
   ZonedDateTime zdt = gc.toZonedDateTime();
   LocalDateTime localDate = zdt.withZoneSameInstant(ZoneId.of("America/Los_Angeles")).toLocalDateTime();

   return localDate;
   }

输出与输入完全相同:

XMLGregorianCalendar xmlDate:“ 2019-09-03T13:22:38.436-07:00”

LocalDateTime localDate:“ 2019-09-03T13:22:38”

此外,这不起作用(相同的方法,不同的语法):

private LocalDateTime convertDate(XMLGregorianCalendar xmlDate) {
    ZonedDateTime utcZoned = xmlDate.toGregorianCalendar().toZonedDateTime().withZoneSameInstant(ZoneId.of("America/Los_Angeles"));
    LocalDateTime localDate = utcZoned.toLocalDateTime();

    return localDate;
}

结果与第一个代码段相同。

我认为我的问题在withZoneSameInstant()方法中。 奇怪的是,当我在参数中输入其他时区代码时,会发生确实的转换。尝试与“太平洋/奥克兰”。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

您的第一个假设是错误的:

  

1)xmlDate参数为UTC

class CustomAdapter (var mylist:ArrayList<User>) :RecyclerView.Adapter<CustomAdapter.viewHolde>(){ val str= FirebaseStorage.getInstance().reference var currentuser = FirebaseAuth.getInstance().currentUser!!.uid var e = str.child(currentuser) var c:Context?=null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolde { var v=LayoutInflater.from(parent.context) .inflate(R.layout.iktem_list,parent,false) return viewHolde(v) } override fun getItemCount(): Int { return mylist.size } override fun onBindViewHolder(holder: viewHolde, position: Int) { holder.username.setText(mylist.get(position).username) holder.userimage.setImageResource(R.drawable.user) holder.title.setText(mylist.get(position).title) holder.decription.setText(mylist.get(position).notes) } class viewHolde(item:View):RecyclerView.ViewHolder(item){ val username=item.findViewById(R.id.iduser)as TextView val userimage=item.findViewById(R.id.idcircleImageView)as CircleImageView val title=item.findViewById(R.id.idtitle)as TextView val decription=item.findViewById(R.id.iddes)as TextView }} 末尾的-07:00是UTC的偏移量。偏移量与America / Los_Angeles时区(太平洋夏令时)一致。 Java可以识别这一点,因此当您转换为America / Los_Angeles时,它不会改变时间。当您转换为太平洋/奥克兰时,确实如此。

我相信您的代码是正确的。

相关问题