33import com .bc .fiduceo .util .TimeUtils ;
44
55import java .io .File ;
6+ import java .io .IOException ;
67import java .text .DecimalFormat ;
78import java .util .Calendar ;
89
910class ArchiveUtils {
1011
1112 private static final DecimalFormat twoDigitsFormat = new DecimalFormat ("00" );
13+ private static final DecimalFormat threeDigitsFormat = new DecimalFormat ("000" );
1214
1315 private static final String FILE_NAME_BEGIN = "ecmwf-era5_oper_" ;
1416
@@ -18,13 +20,34 @@ class ArchiveUtils {
1820 this .rootPath = rootPath ;
1921 }
2022
21- static String getFileName (String collection , String variable , String ymd , String hour ) {
22- return FILE_NAME_BEGIN + collection + "_" + ymd + hour + "00 ." + variable + ".nc" ;
23+ static String getFileName (String collection , String variable , String timeString ) {
24+ return FILE_NAME_BEGIN + collection + "_" + timeString + " ." + variable + ".nc" ;
2325 }
2426
25- public String get (String variableType , int timeStamp ) {
26- final Calendar utcCalendar = TimeUtils .getUTCCalendar ();
27- utcCalendar .setTimeInMillis (timeStamp * 1000L );
27+ static String mapVariable (String variable ) {
28+ switch (variable ) {
29+ case "t2m" :
30+ return "2t" ;
31+ case "u10" :
32+ return "10u" ;
33+ case "v10" :
34+ return "10v" ;
35+ case "siconc" :
36+ return "ci" ;
37+ default :
38+ return variable ;
39+ }
40+ }
41+
42+ static String getForecastTimeString (Calendar utcCalendar ) {
43+ return null ;
44+ }
45+
46+ static String getAnalysisTimeString (Calendar utcCalendar ) {
47+ return null ;
48+ }
49+
50+ static String getTimeString (String collection , Calendar utcCalendar ) throws IOException {
2851 final int year = utcCalendar .get (Calendar .YEAR );
2952
3053 final int month = utcCalendar .get (Calendar .MONTH ) + 1 ;
@@ -33,18 +56,55 @@ public String get(String variableType, int timeStamp) {
3356 final int day = utcCalendar .get (Calendar .DAY_OF_MONTH );
3457 final String dayString = twoDigitsFormat .format (day );
3558
36- final int hour = utcCalendar .get (Calendar .HOUR_OF_DAY );
37- final String hourString = twoDigitsFormat .format (hour );
59+ int hour = utcCalendar .get (Calendar .HOUR_OF_DAY );
60+
61+ if (collection .startsWith ("an_" )) {
62+ final String hourString = twoDigitsFormat .format (hour );
63+ return year + monthString + dayString + hourString + "00" ;
64+ } else if (collection .startsWith ("fc_" )) {
65+ int forecastTimeStep ;
66+ if (hour <= 6 ) {
67+ utcCalendar .add (Calendar .HOUR_OF_DAY , -1 );
68+ forecastTimeStep = 6 + hour ;
69+ hour = 18 ;
70+ } else if (hour <= 18 ) {
71+ forecastTimeStep = hour - 6 ;
72+ hour = 6 ;
73+ } else {
74+ forecastTimeStep = hour - 18 ;
75+ hour = 18 ;
76+ }
77+ final String hourString = twoDigitsFormat .format (hour );
78+
79+ return year + monthString + dayString + hourString + threeDigitsFormat .format (forecastTimeStep );
80+ } else {
81+ throw new IOException ("Unknown era5 collection: " + collection );
82+ }
83+ }
84+
85+ public String get (String variableType , int timeStamp ) throws IOException {
86+ final Calendar utcCalendar = TimeUtils .getUTCCalendar ();
87+ utcCalendar .setTimeInMillis (timeStamp * 1000L );
3888
3989 final int cutPoint = variableType .lastIndexOf ("_" );
4090 final String collection = variableType .substring (0 , cutPoint );
41- final String variable = variableType .substring (cutPoint + 1 , variableType .length ());
4291
43- final String ymd = year + monthString + dayString ;
44- final String fileName = getFileName (collection , variable , ymd , hourString );
92+ String variable = variableType .substring (cutPoint + 1 , variableType .length ());
93+ variable = mapVariable (variable );
94+
95+ final String timeString = getTimeString (collection , utcCalendar );
96+ final String fileName = getFileName (collection , variable , timeString );
97+
98+ final int year = utcCalendar .get (Calendar .YEAR );
99+
100+ final int month = utcCalendar .get (Calendar .MONTH ) + 1 ;
101+ final String monthString = twoDigitsFormat .format (month );
102+
103+ final int day = utcCalendar .get (Calendar .DAY_OF_MONTH );
104+ final String dayString = twoDigitsFormat .format (day );
45105
46106 return rootPath + File .separator + collection + File .separator +
47- year + File .separator + monthString + File .separator + dayString + File .separator +
107+ year + File .separator + monthString + File .separator + dayString + File .separator +
48108 fileName ;
49109 }
50110}
0 commit comments