我在用Jython编程,我想把java.util.GregorianCalendar的日期时间实例转换为Jython的日期时间值。
我已经试过了,但得到以下错误信息:java.util.GregorianCalendar的日期时间实例是一个Jython的日期时间值。
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.YEAR
print "Month",x.MONTH
print "Day", x.DAY_OF_MONTH
print "Hour", x.HOUR_OF_DAY
print "Minute", x.MINUTE
print "Second", x.SECOND
print "Millisecond", x.MILLISECOND
print x.getTime()
日志。
java.util.GregorianCalendar[time=1591195394508,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2020,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=155,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=43,SECOND=14,MILLISECOND=508,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
Year 1
Month 2
Day 5
Hour 11
Minute 12
Second 13
Millisecond 14
Wed Jun 03 16:43:14 CEST 2020
谁能告诉我我做错了什么?
java.time.ZonedDateTime
替换了 GregorianCalendar
顺便说一下,你使用的是糟糕的日期-时间类(GregorianCalendar
),现在已经成为遗留问题,多年前就被现代社会的 "大国重器 "所取代。java.time JSR 310中定义的类。
使用添加到旧类中的新方法进行转换。ZonedDateTime
替换 GregorianCalendar
.
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
继续提取零件。
不需要在月份中增加一个,因为...。java.time 使用合理的月份编号,1-12为1-12月。只使用 java.time,从来没有 GregorianCalendar
.
用Java语法(我不懂Jython)。
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() ;
问题中的代码有两个问题:
datetime
需要微秒。这里我们将纳秒换算为 java.time 到Jython中使用的微秒。datetime
. datetime
. 这里我们提取时区的ID,一个格式为 Continent/Region
诸如 Europe/Paris
或 Pacific/Auckland
. 顺便说一下,遗产 Date
和 GregorianCalendar
类的分辨率为毫秒。Jython的 datetime
类型解析为微秒。的 java.time 类型使用纳秒的分辨率。
该 java.time 框架内置于Java 8及以后的版本中。这些类取代了麻烦的旧的 遗产 日期-时间类,如 java.util.Date
, Calendar
,& SimpleDateFormat
.
要了解更多信息,请参阅 甲骨文教程. 并在Stack Overflow中搜索许多例子和解释。规格是 JSR 310.
该 卓达科技-时间 项目,目前正在 维护模式建议移居美国 java.time 课堂。
您可以交换 java.time 对象直接与您的数据库连接。使用 JDBC驱动程序 符合 JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.*
类,支持Hibernate 5 & JPA 2.2 支持Hibernate 5 & JPA 2.2。java.time.
在哪里获取java.time类?
这样就可以了:
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()