Java 如何将GregorianCalendar转换为Python/Jython datetime?

Java 如何将GregorianCalendar转换为Python/Jython datetime?,java,python,date,jython,gregorian-calendar,Java,Python,Date,Jython,Gregorian Calendar,我正在用Jython编程,我想将java.util.GregorianCalendar datetime实例转换为Jython datetime值 我试过这个: from java.util import Calendar, GregorianCalendar import datetime x = GregorianCalendar.getInstance() y = datetime(x.YEAR, x.MONTH, x.DAY_OF_MONTH, x.HOUR_OF_DAY, x.MI

我正在用Jython编程,我想将java.util.GregorianCalendar datetime实例转换为Jython datetime值

我试过这个:

from java.util import Calendar, GregorianCalendar
import datetime

x = GregorianCalendar.getInstance()

y = datetime(x.YEAR, x.MONTH, x.DAY_OF_MONTH, x.HOUR_OF_DAY, x.MINUTE, x.SECOND, x.MILLISECOND)
但我得到了以下错误:

TypeError: 'module' object is not callable
然后我运行了这个程序,我惊讶地发现错误的值写入了日志。例如,这一年被定为2020年,但日志上写着“1”

日志:

谁能告诉我我做错了什么吗?

这样就可以了:

from java.util import Calendar, GregorianCalendar
import datetime


x = GregorianCalendar.getInstance()

print x
print "Year", x.get(Calendar.YEAR)
print "Month",x.get(Calendar.MONTH)
print "Day", x.get(Calendar.DAY_OF_MONTH)
print "Hour", x.get(Calendar.HOUR_OF_DAY)
print "Minute", x.get(Calendar.MINUTE)
print "Second", x.get(Calendar.SECOND)
print "Millisecond", x.get(Calendar.MILLISECOND)

y = datetime.datetime(x.get(Calendar.YEAR), x.get(Calendar.MONTH)+1,x.get(Calendar.DAY_OF_MONTH), x.get(Calendar.HOUR_OF_DAY), x.get(Calendar.MINUTE), x.get(Calendar.SECOND), x.get(Calendar.MILLISECOND)*1000)

print y
print x.getTime()
java.time.ZonedDateTime
仅供参考,您正在使用糟糕的日期时间类(
gregorianalendar
),这些类现在是遗留的,几年前被JSR 310中定义的现代java.time类所取代

使用添加到旧类的新方法进行转换。替换
gregorianalendar

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
继续提取零件

不需要在月份中添加一个,因为java.time使用健全的月份编号,1-12表示1-12月。只使用java.time而不使用
gregorianalendar
的原因之一

在Java语法中(我不知道Jython):

问题中的代码中有两个问题:

  • 您使用毫秒,但是
    datetime
    的构造函数需要微秒。这里我们将java.time中使用的纳秒转换为Jython
    datetime中使用的微秒
    
  • 您忽略了将时区传递给
    datetime
    的构造函数。这里我们提取时区的ID,一个格式为
    大陆/地区
    的字符串,例如
    欧洲/巴黎
    太平洋/奥克兰
仅供参考,遗留的
Date
gregoriacalendar
类的分辨率为毫秒。Jython
datetime
类型解析为微秒。time类型使用纳秒的分辨率



关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(不正确。您没有将时区从
      GregorianCalendar
      传递给Jython
      datetime
      @BasilBourque的构造函数。您是对的。我编辑了我的响应。毫秒现在乘以1000。我仍然需要弄清楚如何将时区信息从GregorianCalendar传递到Jython datetime。我将查看。)也许明天就可以了。现在我对结果感到满意。<代码> GregorianCalendar <代码>很可怕。Sun、Oracle和JCP社区几年前就放弃了该类的使用,你也应该这么做。考虑使用Java.时间,如我的答案所示。我意识到了这一点,但是我不能使用Java.Times,因为我“我正在开发两个系统之间的接口。系统A将日期信息发送为GregorianCalendar,系统B将此日期信息预期为python datetime。我无法访问这两个系统。易于转换为GregorianCalendar
      ZoneDateTime
      :和。这是否回答了您的问题?”?
      from java.util import Calendar, GregorianCalendar
      import datetime
      
      
      x = GregorianCalendar.getInstance()
      
      print x
      print "Year", x.get(Calendar.YEAR)
      print "Month",x.get(Calendar.MONTH)
      print "Day", x.get(Calendar.DAY_OF_MONTH)
      print "Hour", x.get(Calendar.HOUR_OF_DAY)
      print "Minute", x.get(Calendar.MINUTE)
      print "Second", x.get(Calendar.SECOND)
      print "Millisecond", x.get(Calendar.MILLISECOND)
      
      y = datetime.datetime(x.get(Calendar.YEAR), x.get(Calendar.MONTH)+1,x.get(Calendar.DAY_OF_MONTH), x.get(Calendar.HOUR_OF_DAY), x.get(Calendar.MINUTE), x.get(Calendar.SECOND), x.get(Calendar.MILLISECOND)*1000)
      
      print y
      print x.getTime()
      
      ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
      
      int year = zdt.getYear() ; 
      int month = zdt.getMonthValue() ;
      int day = zdt.getDayOfMonth() ;
      int hour = zdt.getHour() ;
      int minute = zdt.getMinute() ;
      int second = zdt.getSecond() ;
      long micro = TimeUnit.NANOSECONDS.toMicros( zdt.getNano() ) ;  // Convert from the nanosecond resolution of java.time to the microsecond resolution of Jython datetime.
      String timeZoneId = zdt.getZone().getId() ;