Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串日期到xmlgregoriancalendar的转换_Java_String_Date - Fatal编程技术网

Java 字符串日期到xmlgregoriancalendar的转换

Java 字符串日期到xmlgregoriancalendar的转换,java,string,date,Java,String,Date,我编写了这个函数: public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{ XMLGregorianCalendar xmlCalender=null; GregorianCalendar calender = new GregorianCalendar(); calender.setTime(Util.stringToJavaDate(da

我编写了这个函数:

public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
    XMLGregorianCalendar xmlCalender=null;
    GregorianCalendar calender = new GregorianCalendar();
    calender.setTime(Util.stringToJavaDate(date));
    xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
    return xmlCalender;
}

public static Date  stringToJavaDate(String sDate)  throws OmniException{
    Date date=null;
    date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);        
    return date;  
}
当我将日期作为“2014-01-07”传递时,将输出日期作为
2014-01-06T18:30:00:000Z
我错在哪里? 如果我只想获得
2014-01-06T18:30:00
2014-01-06T18:30:00Z


感谢您的帮助

找到以下解决方案。。。。发布它,因为它也可以帮助其他人:)

输出:


2014-04-24T11:15:00.000+02:00对我来说,最优雅的解决方案是:

GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");
使用Java8

扩展示例:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());
这将打印出:

7
1
2014
tl;博士
  • 尽可能多地使用现代java.time类,而不是可怕的遗留类
  • 始终指定所需/预期的时区或UTC偏移量,而不是隐式地依赖JVM的当前默认值
示例代码(无异常处理):

正在将仅日期输入字符串解析到
xmlgorianicalendar
类的对象中 尽可能避免使用糟糕的遗留日期时间类,例如
xmlgoriancalendar
gregorianalendar
Calendar
date
。仅使用现代java.time类

当显示一个字符串(如
“2014-01-07”
)时,解析为
LocalDate

LocalDate.parse( "2014-01-07" )
若要获取包含时间的日期,假设您需要一天中的第一个时刻,请指定时区。让java.time确定一天中的第一个时刻,因为在某些日期的某些区域中,它并不总是00:00:00.0

LocalDate.parse( "2014-01-07" )
         .atStartOfDay( ZoneId.of( "America/Montreal" ) )
这将返回一个
ZonedDateTime
对象

ZonedDateTime zdt = 
        LocalDate
        .parse( "2014-01-07" )
        .atStartOfDay( ZoneId.of( "America/Montreal" ) )
;
zdt.toString()=2014-01-07T00:00-05:00[美国/蒙特利尔]

但显然,您希望一天的开始以UTC为单位(零小时分秒的偏移量)。因此,我们指定
ZoneOffset.UTC
常量作为
ZoneId
参数

ZonedDateTime zdt = 
        LocalDate
        .parse( "2014-01-07" )
        .atStartOfDay( ZoneOffset.UTC )
;
zdt.toString()=2014-01-07T00:00Z

末端的
Z
表示UTC(零偏移量),发音为“Zulu”

如果必须使用遗留类,请转换为的子类

gc.toString()=java.util.GregorianCalendar[time=138905280000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“UTC”,offset=0,dstSaves=0,useDaylight=false,transitions=0,lastRule=null],周的第一天=2,周的第一天=4,纪元=1,年=2014,月=0,年的周=2,月的周=2,月的日=7,年的日=7,周的日=3,月的周的日=1,上午下午=0,小时=0,日的小时=0,分钟=0,秒=0,毫秒=0,分区偏移=0,DST偏移=0]

显然,您确实需要遗留类的对象。如果调用代码无法更新为使用java.time,请转换

XMLGregorianCalendar xgc = 
        DatatypeFactory
        .newInstance()
        .newXMLGregorianCalendar( gc ) 
;
实际上,该代码需要一个try-catch

try
{
    XMLGregorianCalendar xgc =
            DatatypeFactory
                    .newInstance()
                    .newXMLGregorianCalendar( gc );
}
catch ( DatatypeConfigurationException e )
{
    e.printStackTrace();
}
xgc=2014-01-07T00:00:00.000Z

将所有这些放在一起,并进行适当的异常处理

// Given an input string such as "2014-01-07", return a `XMLGregorianCalendar` object
// representing first moment of the day on that date as seen in UTC. 
static public XMLGregorianCalendar getXMLGregorianCalendar ( String input )
{
    Objects.requireNonNull( input );
    if( input.isBlank() ) { throw new IllegalArgumentException( "Received empty/blank input string for date argument. Message # 11818896-7412-49ba-8f8f-9b3053690c5d." ) ; }
    XMLGregorianCalendar xgc = null;
    ZonedDateTime zdt = null;

    try
    {
        zdt =
                LocalDate
                        .parse( input )
                        .atStartOfDay( ZoneOffset.UTC );
    }
    catch ( DateTimeParseException e )
    {
        throw new IllegalArgumentException( "Faulty input string for date does not comply with standard ISO 8601 format. Message # 568db0ef-d6bf-41c9-8228-cc3516558e68." );
    }

    GregorianCalendar gc = GregorianCalendar.from( zdt );
    try
    {
        xgc =
                DatatypeFactory
                        .newInstance()
                        .newXMLGregorianCalendar( gc );
    }
    catch ( DatatypeConfigurationException e )
    {
        e.printStackTrace();
    }

    Objects.requireNonNull( xgc );
    return xgc ;
}
用法

String input = "2014-01-07";
XMLGregorianCalendar xgc = App.getXMLGregorianCalendar( input );
转储到控制台

System.out.println( "xgc = " + xgc );
xgc=2014-01-07T00:00:00.000Z

现代日期时间类与传统日期时间类

日期时间!=一串 不要将日期时间值与其文本表示形式混为一谈。我们解析字符串以获得日期时间对象,并要求日期时间对象生成一个字符串来表示其值。日期时间对象没有“格式”,只有字符串有格式

因此,将您的思维转换为两种不同的模式:模型和演示。确定您心目中的日期值,应用适当的时区作为模型。当需要显示该值时,按照用户期望的格式生成一个字符串

避免遗留日期时间类 这个问题和其他答案都使用旧的麻烦的日期时间类,现在被java.time类取代

ISO 8601 您的输入字符串
“2014-01-07”
为标准格式

中的代码> t>代码>将日期部分与时间部分分开。

末尾的
Z
是祖鲁的缩写,意思是

幸运的是,java.time类在解析/生成字符串时默认使用ISO8601格式。因此,无需指定格式化模式

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = LocalDate.parse( "2014-01-07" ) ;
ld.toString():2014-01-07

一天的开始时间
zoneDateTime
如果要查看当天的第一个时刻,请指定一个
ZoneId
时区以获取时间线上的时刻,一个
zoneDateTime
。时区是至关重要的,因为全球各地的日期因地区而异。巴黎午夜过后几分钟,法国是新的一天,而魁北克山仍然是“昨天”

永远不要假设一天从00:00:00开始。夏时制(DST)等异常意味着一天可能在一天中的其他时间开始,如01:00:00。让java.time确定第一个时刻

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString():2014-01-07T00:00:00Z

为您所需的格式,使用预定义的格式化程序生成字符串,然后在中间用空间替换<代码> T <代码>。< /P>

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " ) ; 
2014-01-07 00:00:00


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

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

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。游妈
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " ) ;