Baseline Widely available
<input>
å
ç´ ç datetime-local
ç±»ååå»ºè®©ç¨æ·ä¾¿æ·è¾å
¥æ¥æåæ¶é´çè¾å
¥æ§ä»¶ï¼å
æ¬âå¹´âãâæâãâæ¥âï¼ä»¥åâæ¶âåâåâã
<label for="meeting-time">Choose a time for your appointment:</label>
<input
type="datetime-local"
id="meeting-time"
name="meeting-time"
value="2018-06-12T19:30"
min="2018-06-07T00:00"
max="2018-06-14T00:00" />
label {
display: block;
font:
1rem "Fira Sans",
sans-serif;
}
input,
label {
margin: 0.4rem 0;
}
æ¤æ§ä»¶ç UI å æµè§å¨èå¼ãå¨ä¸æ¯æçæµè§å¨ä¸ï¼å
¶ä¼ä¼é
å°é级为ç®åç <input type="text">
æ§ä»¶ã
该æ§ä»¶æ¨å¨è¡¨ç¤ºæ¬å°æ¥æåæ¶é´ï¼ä¸ä¸å®æ¯ç¨æ·çæ¬å°æ¥æåæ¶é´ãæ¢å¥è¯è¯´ï¼å ¶å®ç°åºè¯¥å 许年ãæãæ¥ãå°æ¶ãåéç任使æçç»åââå³ä½¿æäºç»åå¨ç¨æ·çæ¬å°æ¶åºæ¯æ æçï¼ä¾å¦ï¼å¤ä»¤æ¶çè½¬æ¢æ¶å·®ï¼ãä¸é¨åææºæµè§å¨ï¼ç¹å«æ¯ iOS ä¸çï¼ç®åæ²¡ææ£ç¡®å°å®ç°è¿ä¸ç¹ã
ç±äº datetime-local
ç±»ååéäºæµè§å¨æ¯æï¼å¹¶ä¸ä¸åæµè§å¨å¨è¾å
¥æ¹æ³ä¸åå¨å·®å¼ï¼ç®åæå¥½æ¯ä½¿ç¨ç¬¬ä¸æ¹æ¡æ¶æåºæ¥å±ç¤ºï¼æè
å®ç°ä¸ä¸ªèªå·±çè¾å
¥æ§ä»¶ãå¦ä¸ä¸ªæ¹æ³æ¯æå为 date
å time
è¾å
¥æ§ä»¶ï¼è¿ä¸¤ä¸ªçæ¯æé½æ¯ datetime-local
æ´å¹¿æ³ã
ä¸é¨åæµè§å¨å¯è½ä¼ç¨ä¸ä¸ªæ®éçææ¬è¾å ¥å ç´ ä»£æ¿æ¾ç¤ºï¼å¹¶å¨è¾å ¥å 容æäº¤å°æå¡å¨ä¹åéªè¯å®ä»¬æ¯å¦æ¯åæ³çæ¥æ/æ¶é´æ ¼å¼ï¼ä½ä½ ä¸å¯ä¿¡èµäºæ¤è¡ä¸ºï¼å ä¸ºç¨æ·ä½¿ç¨çæµè§å¨ä¸å¯é¢ç¥çã
åå¼ä¸ä¸ªè¾å ¥å°æ§ä»¶ä¸çè¡¨ç¤ºæ¥æçåç¬¦ä¸²ãæ¬å°æ¥ææ¶é´åç¬¦ä¸²ä¸æè¿°äºå ³äºæ¤ç±»åçè¾å ¥æ§ä»¶ä½¿ç¨çæ¥æåçè¾å ¥æ ¼å¼ã
ä½ å¯ä»¥å°ä¸ä¸ªå
嫿¥æåæ¶é´ç弿¾å¨ value
屿§ä¸ä»¥ä¸ºæ§ä»¶è®¾ç½®ä¸ä¸ªé»è®¤å¼ï¼åè¿æ ·ï¼
<label for="party">è¾å
¥é¢è®¢å®´ä¼çæ¥æåæ¶é´ï¼</label>
<input
id="party"
type="datetime-local"
name="partydate"
value="2017-06-01T08:30" />
éè¦æ³¨æçæ¯ï¼æ¾ç¤ºçæ¥æåæ¶é´çæ ¼å¼ä¸å®é
value
ä¸çæ ¼å¼ä¸åï¼æ¾ç¤ºçæ¥æåæ¶é´æ ¼å¼ä»¥ç¨æ·æä½ç³»ç»æçåºå设置信æ¯ä¸ºåï¼èæ§ä»¶çæ¥æ/æ¶é´å¼ value
æ»æ¯ yyyy-MM-ddThh:mm
æ ¼å¼ãä¾å¦ï¼å½ä¸ä¾ä¸çå¼è¢«æä¾å°æå¡å¨ä¹åï¼å°ä¼åè¿æ · partydate=2017-06-01T08:30
ã
夿³¨ï¼ å¦å¤è¯·æ³¨æï¼å¦æè¿æ ·çæ°æ®ä»¥ HTTP GET
æäº¤ï¼æ¶é´é¨åçåå·éè¦ç¼ç ä¹åæè½æ¾å¨ URL åæ°ä¸ï¼ä¾å¦ partydate=2017-06-01T08%3A30
ãç¼ç æ¹æ³è¯·åè§ encodeURI()
ã
ä½ ä¹å¯ä»¥å¨ JavaScript ä¸ä½¿ç¨ HTMLInputElement
ç value
屿§æ¥è·ååè®¾ç½®æ¥æçå¼ï¼ä¾å¦ï¼
const dateControl = document.querySelector('input[type="datetime-local"]');
dateControl.value = "2017-06-01T08:30";
JavaScript ç Date
æä¾äºå ç§ç¨äºå°æ°å¼ç±»åçæ¥æè½¬æ¢ä¸ºæ ¼å¼ååç¬¦ä¸²çæ¹æ³ãä¾å¦ï¼Date.toISOString()
æ¹æ³è¿å UTC æ¶åºçæ¥æåæ¶é´ï¼å¸¦æè¡¨ç¤ºè¯¥æ¶åºç Z
åç¼ï¼å é¤ Z
åå°å¯ä»¥æä¾ç¨äº datetime-local
input çæ ¼å¼åçå¼ã
é¤äº <input>
å
ç´ éç¨ç屿§å¤ï¼datetime-local è¾å
¥æ§ä»¶è¿æä¾äºä»¥ä¸å±æ§ã
æ¥åçæææ¥æåæ¶é´çå¼ã妿 value
ç弿äºè¿ä¸æ¶é´æ³ï¼å该å
ç´ ä¸ä¼éè¿çº¦æéªè¯ã妿 max
屿§çå¼ä¸æ¯éµå¾ª YYYY-MM-DDThh:mm
æ ¼å¼çææå符串ï¼å该å
ç´ æ²¡ææå¤§å¼ã
è¯¥å±æ§æå®çå¼å¿
é¡»æäºæçäº min
屿§çå¼ã
æ¥åçææ©æ¥æåæ¶é´çå¼ã妿æ©äºè¿ä¸æ¶é´æ³ï¼å该å
ç´ ä¸ä¼éè¿çº¦æéªè¯ã妿 min
屿§çå¼ä¸æ¯éµå¾ª YYYY-MM-DDThh:mm
æ ¼å¼çææå符串ï¼å该å
ç´ æ²¡ææå°å¼ã
è¯¥å±æ§æå®çå¼å¿
é¡»æ©äºæçäº max
屿§çå¼ã
step
屿§æ¯ä¸ä¸ªæ°åï¼ç¨äºæå®å¼è°æ´çæ¥é¿ï¼æä½¿ç¨ç¹æ®å¼ any
ãè¯¥å±æ§çæè¿°å¦ä¸ï¼ä»
è½ä½¿ç¨åºç¡çè°æ´æ¥é¿ï¼è¥ min
å·²æå®ï¼åä»å
¶å¼å§ï¼å¦åä½¿ç¨ value
ï¼è¥ä¸¤è
åæªæä¾ï¼å为æä¸éå½çé»è®¤å¼ï¼ã
åç¬¦ä¸²å¼ any
è¡¨ç¤ºæ²¡ææ¥é¿çº¦æï¼ä»»ä½çå¼åå¯ä½¿ç¨ï¼é¤äºå
¶ä»ç约æï¼å¦ï¼min
å max
ï¼ã
夿³¨ï¼ å½ç¨æ·è¾å ¥çæ°æ®ä¸ç¬¦åé ç½®çæ¥é¿éå¶æ¶ï¼ç¨æ·ä»£çå¯è½ä¼å°å ¶åèäºå ¥å°æè¿çææå¼ï¼å½æä¸¤ä¸ªå·®å¼ç¸ççé项æ¶ï¼ä¼å 鿩大äºå½åå¼çæ°å¼ã
å¯¹äº datetime-local
è¾å
¥æ§ä»¶ï¼step
å¼çå使¯ç§ï¼æå°å度为 1/1000ï¼å 为åºå±çæ°å¼ä»¥æ¯«ç§ä¸ºåä½ï¼ãé»è®¤ç step
å¼ä¸º 60ï¼è¡¨ç¤º 60 ç§ï¼æä¸åéã60000 毫ç§ï¼ã
ç®åï¼å
³äº step
ç any
å¼ä¸ datetime-local
è¾å
¥æ§ä»¶ä¸èµ·ä½¿ç¨çæä¹å°ä¸æç¡®ã䏿¦ç¡®å®è¯¥ä¿¡æ¯ï¼ææ¡£ä¼ç«å³æ´æ°ã
Date/time è¾å
¥æ§ä»¶ä¹çé常å®ç¨ï¼å®ä»¬æä¾äºæ¹ä¾¿çç¨æ·æ¥å£æ¥éæ©æ¥æåæ¶é´ï¼å¹¶ä¸æ è®ºç¨æ·ç«¯æ¯ä»ä¹æ ·çæ¬å°å设置ï¼é½ä¼ä»¥æ ååæ°æ®åéç»æå¡å¨ã使¯åéäºæµè§å¨çæ¯æï¼<input type="datetime-local">
乿ä¸å°é®é¢ã
æä»¬å
æ¥çç <input type="datetime-local">
åºæ¬çåé«çº§çç¨æ³ï¼ä¹åå¨ï¼åè§å¤çæµè§å¨æ¯æï¼ä¼æä¾ä¸äºåå°æµè§å¨å
¼å®¹é®é¢ç建议ã
<input type="datetime-local">
æç®åçç¨æ³æ¯å° <input>
å <label>
ç»åå¨ä¸èµ·ï¼åä¸é¢è¿æ ·ï¼
<form>
<label for="party">è¾å
¥é¢è®¢å®´ä¼çæ¥æåæ¶é´ï¼</label>
<input id="party" type="datetime-local" name="partydate" />
</form>
è®¾å®æ¥ææ¶é´çæå¤§å¼åæå°å¼
ä½ å¯ä»¥ä½¿ç¨ min
å max
屿§æ¥éå¶ç¨æ·å¯éæ©çæ¥æ/æ¶é´ãå¨ä¸é¢çä¾åä¸æä»¬è®¾å®æå°çæ¥ææ¶é´ 2017-06-01T08:30
åæå¤§çæ¥ææ¶é´ 2017-06-30T16:30
ï¼
<form>
<label for="party">è¾å
¥é¢è®¢å®´ä¼çæ¥æåæ¶é´ï¼</label>
<input
id="party"
type="datetime-local"
name="partydate"
min="2017-06-01T08:30"
max="2017-06-30T16:30" />
</form>
ç»æå¦ä¸ï¼
夿³¨ï¼ ä½ å¯ä»¥ä½¿ç¨ step
屿§è®¾ç½®ä¸å弿¥æ§å¶æ¥ææ¯æ¬¡å¢åç天æ°ï¼ä¾å¦ï¼æè®¸ä½ å¸æåªæææå
å¯éï¼ã使¯ï¼æªæ¢å°æ¬ææ¡£ç¼å乿¶ï¼å¥½åè¿æ²¡ææµè§å¨å®ç°æ¤åè½ã
<input type="datetime-local">
并䏿¯æå¦ size
è¿æ ·ç表å大å°å±æ§ãä½ å¯ä½¿ç¨ CSS æ¥æ§å¶å¤§å°ã
datetime-local
æ§ä»¶å¹¶æ²¡æå°æ¹å¯ä»¥è®¾ç½®æ¥æ/æ¶é´çæ¶åºå/æåºå屿§ãå¨ datetime
è¾å
¥ç±»å䏿ä¾è¿æ¤åè½ï¼ä½è¿ä¸ªç±»åç°å¨å·²è¢«åºå¼ï¼ä¹å·²ä»æ åä¸ç§»é¤ãè¿é¡¹è¢«ç§»é¤ç主è¦åå æ¯ç¼ºå°æµè§å¨çæ¯æï¼ä»¥ååºäºç¨æ·äº¤äº/ç¨æ·ä½éªæ¹æ³çèéãç¸æ¯ä¹ä¸ï¼ä»
使ç¨ä¸ä¸ªï¼æå¤ä¸ªï¼æ§ä»¶æ¥è®¾ç½®æ¥æ/æ¶é´ï¼ç¶ååç¬å¨å¦ä¸æ§ä»¶å¤çæ¶åºï¼è¿æ ·æ´å®¹æä¸äºã
ä¾å¦ï¼å¦æä½ å¨å¼åä¸å¥ç³»ç»ï¼æä½ç¨æ·å¯è½å·²ç»ç»å½è¿æ¥ï¼å¹¶ä¸å·²ç»è®¾ç½®äºæ¶åºï¼ä½ å¯ä»¥ææ¶åºæ¾å¨ä¸ä¸ª hidden
è¾å
¥æ§ä»¶éãä¾å¦ï¼
<input type="hidden" id="timezone" name="timezone" value="-08:00" />
å¦ä¸æ¹é¢ï¼å¦æä½ è¢«è¦æ±å¨ç¨æ·è¾å
¥æ¥ææ¶é´æ¶æä¾æ¶åºè¾å
¥ï¼ä½ å¯ä»¥æä¾ç»ç¨æ·ä¸ç§è¾å
¥æ¹å¼ï¼ä¾å¦ <select>
å
ç´ ï¼
<select name="timezone" id="timezone">
<option value="Pacific/Kwajalein">Eniwetok, Kwajalein</option>
<option value="Pacific/Midway">Midway Island, Samoa</option>
<option value="Pacific/Honolulu">Hawaii</option>
<option value="Pacific/Marquesas">Taiohae</option>
<!-- and so on -->
</select>
以ä¸ä¸¤ä¾ä¸ï¼æ¥æ/æ¶é´åæ¶åºå¯ä»¥ç¬ç«çæ°æ®æäº¤å°æå¡å¨ï¼ä¹åä½ éè¦åçå°±æ¯æå®ä»¬ä¿åå°æå¡å¨æ°æ®åºæ°å½çä½ç½®ã
æ ¡éªé»è®¤æ
åµä¸ <input type="datetime-local">
ä¸å¯¹è¾å
¥å
容è¿è¡éªè¯ãç¨æ·äº¤äºï¼UIï¼çå®ç°é常ä¸å
è®¸ä½ è¾å
¥ä¸æ¯æ¥æ/æ¶é´çå¼ââè¿é常æç¨ãä½ç¨æ·ä¹ä»ä¼å¨ä¸å¡«åä»»ä½å¼çæ
åµä¸æäº¤æ°æ®ï¼æè
è¾å
¥ä¸ä¸ªä¸æ æçæ¥æ/æ¶é´ï¼å¦ï¼4 æ 32 æ¥ï¼ã
ä½ å¯ä»¥ä½¿ç¨ min
å max
æ¥éå¶å¯éæ©çæ¥æï¼åè§è®¾å®æ¥ææ¶é´çæå¤§å¼åæå°å¼ï¼ï¼å¹¶ä¸ä½¿ç¨ required
屿§ä½¿æ¥æ/æ¶é´ä¸ºå¼ºå¶çè¾å
¥é¡¹ãè¿æ ·åçç»ææ¯ï¼å¯ä»¥ä½¿ç¸åºçæµè§å¨å¨ä½ è¾å
¥ä¸ä¸ªè¶
åºèå´çæ¥ææä¸è¾å
¥æ¶æ¾ç¤ºä¸ä¸ªé误信æ¯ã
让æä»¬æ¥ç个ä¾åï¼è¿éæä»¬è®¾ç½®æ¥æ/æ¶é´çæå°å¼åæå¤§å¼ï¼å¹¶ä¸è®¾ç½®è¯¥é¡¹ä¸ºå¿ å¡«ï¼
<form>
<div>
<label for="party"
>Choose your preferred party date and time (required, June 1st 8.30am to
June 30th 4.30pm):</label
>
<input
id="party"
type="datetime-local"
name="partydate"
min="2017-06-01T08:30"
max="2017-06-30T16:30"
required />
<span class="validity"></span>
</div>
<div>
<input type="submit" value="Book party!" />
</div>
</form>
å¦æä½ è¯å¾æäº¤ä¸ä¸ªä¸å®æ´çæ¥æï¼æè æ¥æè¶ åºè®¾å®èå´ï¼ï¼æµè§å¨ä¼æ¾ç¤ºä¸æ¡é误信æ¯ãæ¥è¯è¯è¿ä¸ªç¤ºä¾ï¼
è¿éæä»¥ä¸ç¤ºä¾ç CSSãå¨è¿éæä»¬ä½¿ç¨ :valid
å :invalid
CSS 屿§æ¥æ§å¶å½å弿£ç¡®åéè¯¯çæ ·å¼ãæä»¬éè¦è¿ä¸¤ä¸ªå¾æ æ¾ä¸ä¸ª <span>
å°è¾å
¥å
ç´ åé¢ï¼èé使ç¨è¾å
¥å
ç´ æ¬èº«ï¼å ä¸ºå¨ Chrome ä¸çæçå
容ä¼è¢«æ¾å¨è¡¨åæ§ä»¶éé¢ï¼ä¸è½è®¾ç½®æ ·å¼ææ¾ç¤ºåºæ¥ã
div {
margin-bottom: 10px;
display: flex;
align-items: center;
}
label {
display: inline-block;
width: 300px;
}
input:invalid + span:after {
content: "â";
padding-left: 5px;
}
input:valid + span:after {
content: "â";
padding-left: 5px;
}
è¦åï¼ HTML 表åéªè¯å¹¶ä¸è½åä»£èæ¬æ ¡éªè¾å ¥æ°æ®æ¯å¦ç¬¦åæ ¼å¼è¦æ±ãæäººå¯ä»¥é常容æå°ä¿®æ¹ HTML 以ç»è¿éªè¯ï¼äº¦ææ¯å®å ¨å é¤è¿ä¸ªå ç´ ãåæ ·å¯è½çæ¯ï¼æäººå¯ä»¥é常轻æåå°å®å ¨ç»è¿ HTML èç´æ¥åä½ çæå¡å¨æäº¤æ°æ®ãå¦æä½ æå¡å¨ä»£ç ä¸å¯¹æ¥æ¶å°çæ°æ®è¿è¡æ ¡éªï¼ç¾é¾æ§çæå»å°±å¯è½åçå¨è¿äºéè¯¯æ ¼å¼æ°æ®æäº¤çæ¶åï¼ææ¯æ°æ®å¤ªå¤§ï¼ææ¯æ ¼å¼é误ï¼ççï¼ã
å¤çæµè§å¨æ¯ææ£å¦å颿æå°çï¼ä¸æ¯æçæµè§å¨ä¼ä¼é å°é级æ¾ç¤ºä¸ºæä»¶è¾å ¥æ¡ï¼ä½è¿å¨ç¨æ·çé¢çä¸è´æ§æ¹é¢ï¼åç°çæ§ä»¶ä¸ä¸æ ·ï¼ï¼ä»¥åæ°æ®å¤çæ¹é¢é æäºé®é¢ã
第äºä¸ªé®é¢æ¯æä¸¥éçãæ£å¦æä»¬ä¹åæå°çï¼éç¨ datetime-local
è¾å
¥ï¼å®é
弿»æ¯ä¼è¢«è½¬æ¢æ yyyy-mm-ddThh:mm
æ ¼å¼ã使¢æææ¬è¾å
¥æ¡ä¹åï¼æµè§å¨é»è®¤æ
åµä¸ä¸ç¥éåºå½è¾å
¥ä»ä¹æ ¼å¼çæ¥æï¼äººä»¬æå¾å¤ä¸åç书忥æåæ¶é´çæ¹å¼ï¼å¦ï¼
DDMMYYYY
DD/MM/YYYY
MM/DD/YYYY
DD-MM-YYYY
MM-DD-YYYY
MM-DD-YYYY hh:mm
ï¼12 å°æ¶å¶ï¼MM-DD-YYYY HH:mm
ï¼24 å°æ¶å¶ï¼ä¸ä¸ªåéçæ¹æ³æ¯æ¾ä¸ä¸ª pattern
屿§å¨ datetime-local
è¾å
¥å
ç´ éãè½ç¶ datetime-local
è¾å
¥æ§ä»¶æ¬èº«ä¸ä½¿ç¨è¿ä¸ªå±æ§ï¼ä½é级æ¾ç¤ºçææ¬è¾å
¥æ¡å°ä¼ç¨å°ãä¾å¦ï¼å¨ä¸æ¯æçæµè§å¨ä¸è¯ä¸ä¸è¿ä¸ªä¾åï¼
<form>
<div>
<label for="party"
>Choose your preferred party date and time (required, June 1st 8.30am to
June 30th 4.30pm):</label
>
<input
id="party"
type="datetime-local"
name="partydate"
min="2017-06-01T08:30"
max="2017-06-30T16:30"
pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
required />
<span class="validity"></span>
</div>
<div>
<input type="submit" value="Book party!" />
</div>
<input type="hidden" id="timezone" name="timezone" value="-08:00" />
</form>
ä½ è¯ä¸ä¸æäº¤æ°æ®ï¼å¦æä½ è¾å
¥çå
容䏿»¡è¶³ nnnn-nn-nnTnn:nn
æ ¼å¼ï¼n 为 0 ~ 9 çæ°åï¼ï¼ä½ ä¼çå°æµè§å¨æ¾ç¤ºä¸æ¡é误信æ¯ï¼å¹¶é«äº®è¾å
¥æ¡æ è®°ä¸ºæ æï¼ï¼ä½è¿å¹¶ä¸è½å¦¨ç¢ç¨æ·è¾å
¥æ æçæ¥æææ¯ä¸æ£ç¡®çæ¥æåæ¶é´ã
ç¶èä»ä¹æ ·çç¨æ·ä¼å»çè§£è¿æ ·ä¸ä¸ªä»ä»¬è¦è¾å ¥çæ¥æåæ¶é´æ ¼å¼å¢ï¼
æä»¬ä»æé®é¢å¾ è§£å³ã
div {
margin-bottom: 10px;
}
input:invalid + span {
position: relative;
}
input:invalid + span:after {
content: "â";
position: absolute;
right: -18px;
}
input:valid + span {
position: relative;
}
input:valid + span:after {
content: "â";
position: absolute;
right: -18px;
}
ç®åå¤çè·¨æµè§å¨è¡¨åä¸è¾å
¥æ¥æçæå¥½åæ³æ¯è®©ç¨æ·åå«å¨ä¸åçæ§ä»¶ä¸è¾å
¥å¹´ãæãæ¥åæ¶é´ï¼<select>
å
ç´ å¾æµè¡ââåè§ä¸é¢çå®ç°ï¼ï¼æè
ä½¿ç¨ JavaScript åºï¼å¦ jQuery date picker å jQuery timepicker pluginã
JavaScript 使ç¨åç²¾åº¦æµ®ç¹æ°æ¥å卿¥æï¼æ°å¼ï¼ï¼è¿æå³ç JavaScript 代ç ä¸ä¼éå° Y2K38 é®é¢ï¼é¤é使ç¨å¼ºå¶è½¬æ¢ä¸ºæ´æ°æä½è¿ç®ï¼å ä¸ºææ JavaScript çä½è¿ç®ç¬¦é½ä½¿ç¨ 32 ä½å¸¦ç¬¦å·äºè¿å¶æ´æ°è¡¥ç çå½¢å¼ã
é®é¢åºç°å¨æå¡ç«¯ï¼åå¨å¤§äº 2^31 - 1 çæ¥æãè¦è§£å³è¿ä¸ªé®é¢ï¼ä½ å¿ é¡»ä½¿ç¨ 32 使 ç¬¦å·æ´æ°ã64 ä½å¸¦ç¬¦å·æ´æ°æåç²¾åº¦æµ®ç¹æ°æ¥å卿æçæ¥æãå¦æä½ çæå¡ç«¯æ¯ç¨ PHP ç¼åçï¼é£ä¹ä¿®å¤åªéè¦åçº§å° PHP 8 æ 7ï¼å¹¶åçº§ç¡¬ä»¶å° x86_64 æ IA64ãå¦æä½ æç¡¬ä»¶æ¹é¢çé®é¢ï¼ä½ å¯ä»¥å°è¯å¨ 32 ä½è®¡ç®æºçèææºä¸æ¨¡æ 64 ä½ç¡¬ä»¶ï¼ä½å¤§é¨å VM é½ä¸æ¯æè¿ç§èæåï¼å 为åå¨ç¨³å®æ§åæ§è½çé®é¢ã
Y10k é®é¢ï¼é常æ¯å®¢æ·ç«¯ï¼å¨è®¸å¤æå¡å¨ä¸ï¼æ¥æåå¨ä¸ºæ°åèéå符串ââåºå®å¤§å°ä¸ä¸æ ¼å¼æ å ³ï¼å¤§ç«¯å¯¹é½ï¼ãå¨ 10000 å¹´ä¹åï¼è¿äºæ°ååªæ¯ä¼æ¯ä»¥åæ´å¤§ä¸ç¹ï¼å æ¤æå¡å¨ä¸ä¸è¬ä¸ä¼åå¨ 10000 å¹´ä¹åæäº¤è¡¨åçé®é¢ã
é®é¢åºç°å¨å®¢æ·ç«¯ä¸ï¼è§£æè¶ è¿ 4 ä½ç年份ã
<!--midnight of January 1st, 10000: the exact time of Y10K-->
<input type="datetime-local" value="+010000-01-01T05:00" />
å°±æ¯è¿ä¹ç®åï¼ä½ åªéè¦ä¸ºä»»æä½æ°çæ¥æç¼å代ç ãä¸è¦åªåå¤ 5 使°çã以䏿¯ä½¿ç¨ç¼ç¨æ¹å¼è®¾ç½®å¼ç JavaScript 代ç ï¼
function setValue(element, date) {
const isoString = date.toISOString();
element.value = isoString.substring(0, isoString.indexOf("T") + 6);
}
妿 Y10K é®é¢ä¼å¨ä½ 离ä¸ä»¥åç许å¤ä¸ªä¸çºªæåçï¼é£ä¸ºä»ä¹è¿è¦æ å¿å®å¢ï¼æ£å ä¸ºä½ å·²ç»èµ°äºï¼ä¸æ²¡æå ¶ä»è¶³å¤äºè§£ç³»ç»ç¼ç ç人åå»ä¿®å¤å®ï¼æä»¥ä½¿ç¨ä½ ç软件çå ¬å¸å°æ æ³ä½¿ç¨ä½ ç软件ã
示ä¾å¨è¿ä¸ªç¤ºä¾ä¸ï¼æä»¬åå»ºä¸¤å¥ UI å
ç´ æ¥éæ©æ¥ææ¶é´ââä¸å¥åçç <input type="datetime-local">
ï¼å¦ä¸å¥æ¯ä¸ç³»å <select>
å
ç´ ä»¥å¨ä¸æ¯æåçæ§ä»¶çæµè§å¨ä¸éæ©æ¥æåæ¶é´ã
HTML 代ç å¦ä¸ï¼
<form>
<div class="nativeDateTimePicker">
<label for="party">Choose a date and time for your party:</label>
<input type="datetime-local" id="party" name="bday" />
<span class="validity"></span>
</div>
<p class="fallbackLabel">Choose a date and time for your party:</p>
<div class="fallbackDateTimePicker">
<div>
<span>
<label for="day">Day:</label>
<select id="day" name="day"></select>
</span>
<span>
<label for="month">Month:</label>
<select id="month" name="month">
<option selected>January</option>
<option>February</option>
<option>March</option>
<option>April</option>
<option>May</option>
<option>June</option>
<option>July</option>
<option>August</option>
<option>September</option>
<option>October</option>
<option>November</option>
<option>December</option>
</select>
</span>
<span>
<label for="year">Year:</label>
<select id="year" name="year"></select>
</span>
</div>
<div>
<span>
<label for="hour">Hour:</label>
<select id="hour" name="hour"></select>
</span>
<span>
<label for="minute">Minute:</label>
<select id="minute" name="minute"></select>
</span>
</div>
</div>
</form>
æä»½æ¯åºå®åæ»çï¼å®ä»¬æ¯ä¸åçï¼ï¼æ¥æå年份ç弿¯ä¾æ®éä¸çæå年卿çæçï¼å¹¶ä¸ç®åçå¹´ä»½é¡ºåºæåï¼ä»£ç çæ³¨é以详ç»è§£éäºè§£è¿äºå½æ°æ¯å¦ä½å·¥ä½çï¼ï¼æä»¬ä¹å³å®å¨æçæå°æ¶ååç§ï¼å®ä»¬çæ°éå®å¨æ¯å¤äºç¹ï¼
div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid + span:after {
position: absolute;
content: "â";
padding-left: 5px;
}
input:valid + span:after {
position: absolute;
content: "â";
padding-left: 5px;
}
代ç çå¦ä¸é¨åä¹è®¸ä¼å¼èµ·ä¸å®çå
´è¶£ï¼é£å°±æ¯åè½æ£æ¥ä»£ç ââæ£æ¥æµè§å¨æ¯å¦æ¯æ <input type="datetime-local">
ï¼æä»¬å¯ä»¥å建ä¸ä¸ªæ°ç <input>
å
ç´ ï¼è®¾ç½®å®ç type
为 datetime-local
ï¼ç¶åç«å³æ£æ¥å®è¢«è®¾ç½®çç±»åã䏿¯æ datetime-local
çæµè§å¨è¿å text
ï¼å 为è¿å°±æ¯ datetime-local
è¦åéçç±»åã妿 <input type="datetime-local">
ä¸è¢«æ¯æï¼æä»¬éèåççæ§ä»¶å¹¶æ¾ç¤ºå¤ç¨çæ§ä»¶ UIï¼<select>
ï¼æ¥æ¿ä»£ã
// Obtain UI widgets
const nativePicker = document.querySelector(".nativeDateTimePicker");
const fallbackPicker = document.querySelector(".fallbackDateTimePicker");
const fallbackLabel = document.querySelector(".fallbackLabel");
const yearSelect = document.querySelector("#year");
const monthSelect = document.querySelector("#month");
const daySelect = document.querySelector("#day");
const hourSelect = document.querySelector("#hour");
const minuteSelect = document.querySelector("#minute");
// hide fallback initially
fallbackPicker.style.display = "none";
fallbackLabel.style.display = "none";
// test whether a new datetime-local input falls back to a text input or not
const test = document.createElement("input");
try {
test.type = "datetime-local";
} catch (e) {
console.log(e.description);
}
// if it does, run the code inside the if () {} block
if (test.type === "text") {
// hide the native picker and show the fallback
nativePicker.style.display = "none";
fallbackPicker.style.display = "block";
fallbackLabel.style.display = "block";
// populate the days and years dynamically
// (the months are always the same, therefore hardcoded)
populateDays(monthSelect.value);
populateYears();
populateHours();
populateMinutes();
}
function populateDays(month) {
// delete the current set of <option> elements out of the
// day <select>, ready for the next set to be injected
while (daySelect.firstChild) {
daySelect.removeChild(daySelect.firstChild);
}
// Create variable to hold new number of days to inject
let dayNum;
// 31 or 30 days?
if (
[
"January",
"March",
"May",
"July",
"August",
"October",
"December",
].includes(month)
) {
dayNum = 31;
} else if (["April", "June", "September", "November"].includes(month)) {
dayNum = 30;
} else {
// If month is February, calculate whether it is a leap year or not
const year = yearSelect.value;
const isLeap = new Date(year, 1, 29).getMonth() === 1;
dayNum = isLeap ? 29 : 28;
}
// inject the right number of new <option> elements into the day <select>
for (let i = 1; i <= dayNum; i++) {
const option = document.createElement("option");
option.textContent = i;
daySelect.appendChild(option);
}
// if previous day has already been set, set daySelect's value
// to that day, to avoid the day jumping back to 1 when you
// change the year
if (previousDay) {
daySelect.value = previousDay;
// If the previous day was set to a high number, say 31, and then
// you chose a month with less total days in it (e.g. February),
// this part of the code ensures that the highest day available
// is selected, rather than showing a blank daySelect
if (daySelect.value === "") {
daySelect.value = previousDay - 1;
}
if (daySelect.value === "") {
daySelect.value = previousDay - 2;
}
if (daySelect.value === "") {
daySelect.value = previousDay - 3;
}
}
}
function populateYears() {
// get this year as a number
const date = new Date();
const year = date.getFullYear();
// Make this year, and the 100 years before it available in the year <select>
for (let i = 0; i <= 100; i++) {
const option = document.createElement("option");
option.textContent = year - i;
yearSelect.appendChild(option);
}
}
function populateHours() {
// populate the hours <select> with the 24 hours of the day
for (let i = 0; i <= 23; i++) {
const option = document.createElement("option");
option.textContent = i < 10 ? `0${i}` : i;
hourSelect.appendChild(option);
}
}
function populateMinutes() {
// populate the minutes <select> with the 60 hours of each minute
for (let i = 0; i <= 59; i++) {
const option = document.createElement("option");
option.textContent = i < 10 ? `0${i}` : i;
minuteSelect.appendChild(option);
}
}
// when the month or year <select> values are changed, rerun populateDays()
// in case the change affected the number of available days
yearSelect.onchange = () => {
populateDays(monthSelect.value);
};
monthSelect.onchange = () => {
populateDays(monthSelect.value);
};
//preserve day selection
let previousDay;
// update what day has been set to previously
// see end of populateDays() for usage
daySelect.onchange = () => {
previousDay = daySelect.value;
};
夿³¨ï¼ è¯·è®°ä½æäºå¹´ä»½æ 53 个ææï¼è§æ¯å¹´ç卿°ï¼ï¼å½ä½ å¨å¼å产ååºç¨æ¶åºå½èèè¿ä¸ªé®é¢ã
è§è æµè§å¨å ¼å®¹æ§ åè§RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4