如何将公历日期格式转换为朱利安日期格式?

时间:2017-03-16 08:51:38

标签: java sql date

我希望将dd-MON-yyyy转换为Julian日期作为针对 JDE 的SQL查询的一部分。如果有人可以指导如何实现这一点,那将是非常有帮助的。

new JulianDate()。当date1为 mm / dd / yyyy 格式时,ConvertToJulian(date1)有效。但是当date1处于 dd-MON-yyyy 格式时,我收到错误:

java.text.ParseException: Unparseable date: "16-Mar-2017"

在JDE中,日期以Julian格式存储。

请注意这里mm / dd / yyyy和dd-MON-yyyy都是字符串格式。

因此无法应用DateFormatSimpleDateFormat等。

同样在SQL中我相信它是dd-MON-yyyy格式而不是dd-MMM-yyyy格式。

3 个答案:

答案 0 :(得分:2)

您需要使用dd-MMM-yyyy格式。

看看下面的代码。这会将给定的日期格式转换为Julian格式。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatConverter {

    private String inputDateFormat;
    private String outputDateFormat;

    private DateFormatConverter (String inputDateFormat, String outputDateFormat) {
        this.inputDateFormat = inputDateFormat;
        this.outputDateFormat = outputDateFormat;
    }

    private String convert(String inputDate) throws ParseException {
        SimpleDateFormat idf = new SimpleDateFormat(inputDateFormat);
        SimpleDateFormat odf = new SimpleDateFormat(outputDateFormat);
        Date date = idf.parse(inputDate);
        String outputDate = odf.format(date);
        return outputDate;
    }

    public static String toJulian(String inputFormat, String inputDate) throws ParseException {
        String suffixFormat = "yyDDD";
        String prefixFormat = "yyyy";
        String suffix = new DateFormatConverter(inputFormat, suffixFormat).convert(inputDate);
        int centuryPrefix = Integer.parseInt(new DateFormatConverter(inputFormat, prefixFormat).convert(inputDate).substring(0, 2))-19;
        return centuryPrefix+suffix;
    }

    public static void main(String[] args) throws ParseException {
        String jd = DateFormatConverter.toJulian("dd-MMM-yyyy", "01-Jan-2017");
        System.out.println(jd);
    }

}
  

附加

请参阅有关Julian日期的信息:

https://docs.oracle.com/cd/E26228_01/doc.93/e21961/julian_date_conv.htm#WEAWX259

希望这有帮助!

答案 1 :(得分:1)

TL;博士

LocalDate.parse( 
    "16-Mar-2017" , 
    DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US )
)

java.time

现代方法是使用java.time类。避免使用臭名昭着的旧日期时间类,现在是遗产。

解析日期字符串

通过定义要匹配的格式设置模式来解析日期字符串。指定用于翻译月份名称的人类语言Locale

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
String input = "16-Mar-2017" ;

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate localDate = LocalDate.parse( input , f );

JD Edwards EnterpriseOne日期格式

如果JDE表示“JD Edwards EnterpriseOne”,那么这些系统会使用不常见的格式将仅日期值表示为字符串,CYYDDD其中:

  • C =世纪,20年代为0,2000年代为1。添加到19以获取世纪号,乘以100即可获得年份数。
  • YY =本世纪。
  • DDD =一年中的一天,运行1到365(或闰年366)。

让我们以这种格式建立一个字符串。

// Build output in CYYDDD format used by JD Edwards EnterpriseOne.
int c = ( ( localDate.getYear ( ) / 100 ) - 19 );
String yy = ( String.valueOf ( localDate.getYear ( ) ) ).substring ( 2 ); // Substring of positions 3-4, index numbering is 2.
String ddd = String.format ( "%03d", localDate.getDayOfYear ( ) );
String output = c + yy + ddd ;

转储到控制台。

System.out.println ("input: " + input );
System.out.println ( "output: " + output );

跑步时。

  

输入:2017年3月16日

     输出:117075

现在转向另一个方向,解析JDE日期字符串以获得LocalDate。我们提取1的世纪代码,将其添加到19,然后乘以100,最后添加世纪的两位数。从该整数年份开始,我们创建一个Year对象。通过向Year对象提供每年解析的整数,我们得到一个LocalDate对象。

// Going the other direction, parsing CYYDDD to get a `LocalDate`.
String cyyddd = "117075";
String c_ = cyyddd.substring ( 0, 0 + 1 ); // Index-counting, zero-based.
String yy_ = cyyddd.substring ( 1, 1 + 2 );
String ddd_ = cyyddd.substring ( 3 );
Year year = Year.of ( ( ( Integer.valueOf ( c_ ) + 19 ) * 100 ) + Integer.valueOf ( yy_ ) );
LocalDate ld = year.atDay( Integer.valueOf ( ddd_ ));

转储到控制台。

System.out.println ("cyyddd: " + cyyddd );
System.out.println ("ld: " + ld );
  

cyyddd:117075

     

ld:2017-03-16

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

我做了以下事情:

String date1="dd-MMM-yyyy";
String date2="MM/dd/yyyy";
SimpleDateFormat idf = new SimpleDateFormat(date1);
SimpleDateFormat odf = new SimpleDateFormat(date2);
Date dateFrom = idf.parse(fromDate);
Date dateTo = idf.parse(toDate);

然后转换为Julian Date我用过:

new JulianDate().ConvertToJulian(odf.format(dateFrom));
new JulianDate().ConvertToJulian(odf.format(dateTo));

希望有人会在将来发现它有用。