Index: trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 15738)
+++ trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 15739)
@@ -12,4 +12,6 @@
 import java.net.MalformedURLException;
 import java.nio.file.InvalidPathException;
+import java.time.Year;
+import java.time.ZoneOffset;
 import java.util.Collection;
 import java.util.Collections;
@@ -95,4 +97,17 @@
     private static ImageryInfo convertImagery(ImageryInfo info) {
         try {
+            if (info.getUrl().contains("{time}")) {
+                final String instant = Year.now().atDay(1).atStartOfDay(ZoneOffset.UTC).toInstant().toString();
+                final String example = String.join("/", instant, instant);
+                final String initialSelectionValue = info.getDate() != null ? info.getDate() : example;
+                final String userDate = JOptionPane.showInputDialog(MainApplication.getMainFrame(),
+                        tr("Time filter for \"{0}\" such as \"{1}\"", info.getName(), example),
+                        initialSelectionValue);
+                if (userDate == null) {
+                    return null;
+                }
+                info.setDate(userDate);
+                // TODO persist new {time} value (via ImageryLayerInfo.save?)
+            }
             switch(info.getImageryType()) {
             case WMS_ENDPOINT:
Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 15738)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 15739)
@@ -277,5 +277,7 @@
     /**
       * creation date of the imagery (in the form YYYY-MM-DD;YYYY-MM-DD, where
-      * DD and MM as well as a second date are optional)
+      * DD and MM as well as a second date are optional).
+      *
+      * Also used as time filter for WMS time={time} parameter (such as Sentinel-2)
       * @since 11570
       */
Index: trunk/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java	(revision 15738)
+++ trunk/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java	(revision 15739)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.layer.WMSLayer;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -30,6 +31,4 @@
  */
 public class TemplatedWMSTileSource extends AbstractWMSTileSource implements TemplatedTileSource {
-    private final Map<String, String> headers = new ConcurrentHashMap<>();
-    private final Set<String> serverProjections;
     // CHECKSTYLE.OFF: SingleSpaceSeparator
     private static final Pattern PATTERN_HEADER = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}");
@@ -43,4 +42,5 @@
     private static final Pattern PATTERN_WIDTH  = Pattern.compile("\\{width\\}");
     private static final Pattern PATTERN_HEIGHT = Pattern.compile("\\{height\\}");
+    private static final Pattern PATTERN_TIME   = Pattern.compile("\\{time\\}"); // Sentinel-2
     private static final Pattern PATTERN_PARAM  = Pattern.compile("\\{([^}]+)\\}");
     // CHECKSTYLE.ON: SingleSpaceSeparator
@@ -49,8 +49,14 @@
 
     private static final Pattern[] ALL_PATTERNS = {
-        PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX, PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N, PATTERN_WIDTH, PATTERN_HEIGHT
+            PATTERN_HEADER, PATTERN_PROJ, PATTERN_WKID, PATTERN_BBOX,
+            PATTERN_W, PATTERN_S, PATTERN_E, PATTERN_N,
+            PATTERN_WIDTH, PATTERN_HEIGHT, PATTERN_TIME,
     };
 
+    private final Set<String> serverProjections;
+    private final Map<String, String> headers = new ConcurrentHashMap<>();
+    private final String date;
     private final boolean switchLatLon;
+
     /**
      * Creates a tile source based on imagery info
@@ -62,4 +68,5 @@
         this.serverProjections = new TreeSet<>(info.getServerProjections());
         this.headers.putAll(info.getCustomHttpHeaders());
+        this.date = info.getDate();
         handleTemplate();
         initProjection();
@@ -144,4 +151,7 @@
                 replacement = String.valueOf(getTileSize());
                 break;
+            case "time":
+                replacement = Utils.encodeUrl(date);
+                break;
             default:
                 replacement = '{' + matcher.group(1) + '}';
