我希望将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都是字符串格式。
因此无法应用DateFormat
,SimpleDateFormat
等。
同样在SQL中我相信它是dd-MON-yyyy格式而不是dd-MMM-yyyy格式。
答案 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)
LocalDate.parse(
"16-Mar-2017" ,
DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US )
)
现代方法是使用java.time类。避免使用臭名昭着的旧日期时间类,现在是遗产。
通过定义要匹配的格式设置模式来解析日期字符串。指定用于翻译月份名称的人类语言Locale
。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
String input = "16-Mar-2017" ;
LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate localDate = LocalDate.parse( input , f );
如果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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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));
希望有人会在将来发现它有用。