Java 如何将GregorianCalendar转换为Python/Jython datetime?
我正在用Jython编程,我想将java.util.GregorianCalendar datetime实例转换为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
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):
问题中的代码中有两个问题:
- 您使用毫秒,但是
的构造函数需要微秒。这里我们将java.time中使用的纳秒转换为Jythondatetime
datetime中使用的微秒李>
- 您忽略了将时区传递给
的构造函数。这里我们提取时区的ID,一个格式为datetime
的字符串,例如大陆/地区
或欧洲/巴黎
李>太平洋/奥克兰
- 您忽略了将时区传递给
Date
和gregoriacalendar
类的分辨率为毫秒。Jythondatetime
类型解析为微秒。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(不正确。您没有将时区从
传递给JythonGregorianCalendar
@BasilBourque的构造函数。您是对的。我编辑了我的响应。毫秒现在乘以1000。我仍然需要弄清楚如何将时区信息从GregorianCalendar传递到Jython datetime。我将查看。)也许明天就可以了。现在我对结果感到满意。<代码> GregorianCalendar <代码>很可怕。Sun、Oracle和JCP社区几年前就放弃了该类的使用,你也应该这么做。考虑使用Java.时间,如我的答案所示。我意识到了这一点,但是我不能使用Java.Times,因为我“我正在开发两个系统之间的接口。系统A将日期信息发送为GregorianCalendar,系统B将此日期信息预期为python datetime。我无法访问这两个系统。易于转换为GregorianCalendar和datetime
:和。这是否回答了您的问题?”?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() ;