1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #' MODIS Date Conversion and Testing
- #'
- #' @description
- #' This function converts a sequence of input dates to 'YYYY-MM-DD' and
- #' 'YYYYDDD'.
- #'
- #' @param begin,end \code{character} or \code{Date}. Begin (end) date of MODIS
- #' time series, see Note. If not provided, this defaults to \code{"1972-01-01"}
- #' (\code{Sys.Date()}).
- #'
- #' @return
- #' A \code{list} of begin and end dates formatted according to 'YYYY-MM-DD'
- #' (first two slots; class \code{Date}) and 'YYYYDDD' (second two slots; class
- #' \code{character}).
- #'
- #' @note
- #' If input dates are supplied as \code{character}, this function either expects
- #' 7-digit strings in the MODIS intrinsic form \code{'\%Y\%j'} or, alternatively,
- #' 10-digit strings in the form \code{'\%Y-\%m-\%d'} where the two field separators
- #' need to be uniform (see Examples).
- #'
- #' @seealso \code{\link{strptime}}.
- #'
- #' @author
- #' Matteo Mattiuzzi, Florian Detsch
- #'
- #' @examples
- #' transDate()
- #' transDate(begin = "2009.01.01") # ends with current date
- #' transDate(end = "2009.01.01") # starts with Landsat 1
- #' transDate(begin = c("2009-01-01", "2010-01-01"), end = "2011.03.16")
- #'
- #' @export transDate
- #' @name transDate
- transDate <- function(begin = NULL, end = NULL) {
-
- begin <- if (inherits(begin, "Date")) {
- format(begin, "%Y.%m.%d")
- } else if (is.null(begin)) {
- "1972.01.01" # start with Landsat 1
- } else begin
- end <- if (inherits(end, "Date")) {
- format(end, "%Y.%m.%d")
- } else if (is.null(end)) {
- format(Sys.Date(), "%Y.%m.%d") # current date
- } else end
- ## if 'begin' dates come in '%Y%j' format, reformat to '%Y.%m.%d'
- if (any(nchar(begin) == 7)) {
-
- # if all 'begin' dates have the same format, proceed
- if (all(nchar(begin) == 7)) {
- begin <- strftime(as.Date(begin, "%Y%j"), "%Y.%m.%d")
-
- # else throw error
- } else {
- stop("Input dates are required to have the same format (e.g., '%Y%j').\n")
- }
- }
-
- ## same as above, but for 'end' dates
- if (any(nchar(end) == 7)) {
-
- if (all(nchar(end) == 7)) {
- end <- strftime(as.Date(end,"%Y%j"),"%Y.%m.%d")
-
- } else {
- stop("Input dates are required to have the same format (e.g., '%Y%j').\n")
- }
- }
- divisor <- substr(begin,5,5)
- begin <- as.Date(begin, format = paste0("%Y", divisor, "%m", divisor, "%d"))
- if (any(is.na(begin)))
- stop("'begin' date is either in a wrong format or an invalid date.\n")
- divisor <- substr(end,5,5)
- end <- as.Date(end,format=paste("%Y",divisor,"%m",divisor,"%d",sep=""))
- if (any(is.na(end)))
- stop("'end' date is either in a wrong format or an invalid date.\n")
- if (any(end < begin)) {
- warning("'begin' and 'end' dates seem to be confused, reordering dates...\n")
- dts <- sort(c(begin, end))
- begin <- dts[1:(length(dts) - 1)]
- end <- dts[length(dts)]
- }
- beginDOY <- format(as.Date(begin,format="%Y.%m.%d"), "%Y%j")
- endDOY <- format(as.Date(end,format="%Y.%m.%d"), "%Y%j")
- return(list(begin=begin,end=end,beginDOY=beginDOY,endDOY=endDOY))
- }
|