将 PHP 日期格式转换为 Javascript 日期格式的函数(不是日期本身!)

我正在寻找将 PHP 日期格式(即 Ymd H:i:s)转换为 javascript 日期格式(分别为 YYYY-mm-dd HH:mm:ss)的简单方法。


我不想转换日期(这个问题已经有答案了),我正在寻找工具/函数来转换格式代码(我还不知道,因为它是由用户在应用程序中定义的) .


用户可以用 PHP date() 定义的不同方式来定义它,即“Y/m/d H:i”或“Ydm Hi”,在 javascript 中显示日期时我需要使用相同的格式。


你知道有什么现成的转换函数来制作它吗?


<?php

$timeformat_php = "H:i:s"; //just defined by the user

$time_universal = date( $timeformat_php, strtotime( $time_php ) );

echo date($timeformat_php, $time_universal); //print as defined by user

?>


<script>

var timeformatPhp = '<?php echo $timeformat_php ?>';

var timeformatJavascript = functionThatIamLookingFor (timeformatPhp);

alert(moment($time_universal).format(timeformatJavascript); //printed again the way user defined

</script>

任何帮助将不胜感激。谢谢。


喵喵时光机
浏览 198回答 1
1回答

慕哥9229398

如果您要使用 PHP 格式化标记来格式化 ECMAScript 日期对象,那么类似以下内容可能会有所帮助。它支持除时区名称之外的所有标记。我认为你不能仅仅在浏览器中使用 javascript 来可靠地做到这一点,尽管像 node.js 这样的东西可能能够做到。有一些功能可以使用,例如是否遵守夏令时以及生成 RFC 2822 格式字符串,但我认为它们很容易添加。它支持带引号的字符,因此您可以构建如下字符串:P.format(date, 'jS \\o\\f F, Y') // 1st of August, 2019任何与标记不匹配的字符都被复制到输出字符串(例如上面的空格和逗号)。// Parser and formatter using PHP tokenslet P = function(global) {&nbsp; let P = {lang: 'en-GB'};&nbsp; // Format tokens and functions&nbsp; let tokens = {&nbsp;&nbsp;&nbsp; &nbsp; // DAY&nbsp; &nbsp; // day of month, pad to 2 digits&nbsp; &nbsp; d: d => pad(d.getDate()),&nbsp; &nbsp; // Day name, first 3 letters&nbsp; &nbsp; D: d => getDayName(d).substr(0,3),&nbsp; &nbsp; // day of month, no padding&nbsp; &nbsp; j: d => d.getDate(),&nbsp; &nbsp; // Full day name&nbsp; &nbsp; l: d => getDayName(d),&nbsp; &nbsp; // ISO weekday number (1 = Monday ... 7 = Sunday)&nbsp; &nbsp; N: d => d.getDay() || 7,&nbsp; &nbsp; // Ordinal suffix for day of the month&nbsp; &nbsp; S: d => getOrdinal(d.getDate()),&nbsp; &nbsp; // Weekday number (0 = Sunday, 6 = Saturday)&nbsp; &nbsp; w: d => d.getDay(),&nbsp; &nbsp; // Day of year, 1 Jan is 0&nbsp; &nbsp; z: d => {&nbsp; &nbsp; &nbsp; let Y = d.getFullYear(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; M = d.getMonth(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D = d.getDate();&nbsp; &nbsp; &nbsp; return Math.floor((Date.UTC(Y, M, D) - Date.UTC(Y, 0, 1)) / 8.64e7) ;&nbsp; &nbsp; },&nbsp; &nbsp; // ISO week number of year&nbsp; &nbsp; W: d => getWeekNumber(d)[1],&nbsp; &nbsp; // Full month name&nbsp; &nbsp; F: d => getMonthName(d),&nbsp; &nbsp; // Month number, padded&nbsp; &nbsp; m: d => pad(d.getMonth() + 1),&nbsp; &nbsp; // 3 letter month name&nbsp; &nbsp; M: d => getMonthName(d).substr(0, 3),&nbsp; &nbsp; // Month number, no pading&nbsp; &nbsp; n: d => d.getMonth() + 1,&nbsp; &nbsp; // Days in month&nbsp; &nbsp; t: d => new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate(),&nbsp; &nbsp; // Return 1 if d is a leap year, otherwise 0&nbsp; &nbsp; L: d => new Date(d.getFullYear(), 1, 29).getDate() == 29? 1 : 0,&nbsp; &nbsp; // ISO week numbering year&nbsp; &nbsp; o: d => getWeekNumber(d)[0],&nbsp; &nbsp; // 4 digit year&nbsp; &nbsp; Y: d => {&nbsp; &nbsp; &nbsp; let year = d.getFullYear();&nbsp; &nbsp; &nbsp; if (year < 0) {&nbsp; &nbsp; &nbsp; &nbsp; year = '-' + ('000' + Math.abs(year)).slice(-4);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; return year;&nbsp; &nbsp; },&nbsp; &nbsp; // 2 digit year&nbsp; &nbsp; y: d => {&nbsp; &nbsp; &nbsp; let year = d.getFullYear();&nbsp; &nbsp; &nbsp; if (year >= 0) {&nbsp; &nbsp; &nbsp; &nbsp; return ('0' + year).slice(-2);&nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; year = Math.abs(year);&nbsp; &nbsp; &nbsp; &nbsp; return - + ('0' + year).slice(-2);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; },&nbsp; &nbsp; // Lowercase am or pm&nbsp; &nbsp; a: d => d.getHours() < 12? 'am' : 'pm',&nbsp; &nbsp; // Uppercase AM or PM&nbsp; &nbsp; A: d => d.getHours() < 12? 'AM' : 'PM',&nbsp; &nbsp; // Swatch internet time&nbsp; &nbsp; B: d => (((+d + 3.6e6) % 8.64e7) / 8.64e4).toFixed(0),&nbsp; &nbsp; // 12 hour hour no padding&nbsp; &nbsp; g: d => (d.getHours() % 12) || 12,&nbsp; &nbsp; // 24 hour hour no padding&nbsp; &nbsp; G: d => d.getHours(),&nbsp; &nbsp; // 12 hour hour padded&nbsp; &nbsp; h: d => pad((d.getHours() % 12) || 12),&nbsp; &nbsp; // 24 hour hour padded&nbsp; &nbsp; H: d => pad(d.getHours()),&nbsp; &nbsp; // Minutes padded&nbsp; &nbsp; i: d => pad(d.getMinutes()),&nbsp; &nbsp; // Seconds padded&nbsp; &nbsp; s: d => pad(d.getSeconds()),&nbsp; &nbsp; // Microseconds padded - always returns 000000&nbsp; &nbsp; u: d => '000000',&nbsp; &nbsp; // Milliseconds&nbsp; &nbsp; v: d => padd(d.getMilliseconds()),&nbsp; &nbsp; // Timezone identifier: UTC, GMT or IANA Tz database identifier - Not supported&nbsp; &nbsp; e: d => void 0,&nbsp; &nbsp; // If in daylight saving: 1 yes, 0 no&nbsp; &nbsp; I: d => d.getTimezoneOffset() == getOffsets(d)[0]? 0 : 1,&nbsp; &nbsp; // Difference to GMT in hours, e.g. +0200&nbsp; &nbsp; O: d => minsToHours(-d.getTimezoneOffset(), false),&nbsp; &nbsp; // Difference to GMT in hours with colon, e.g. +02:00&nbsp; &nbsp; P: d => minsToHours(-d.getTimezoneOffset(), true),&nbsp; &nbsp; // Timezone abbreviation, e.g. AEST. Dodgy but may work…&nbsp; &nbsp; T: d => d.toLocaleString('en',{year:'numeric',timeZoneName:'long'}).replace(/[^A-Z]/g, ''),&nbsp; &nbsp; // Timezone offset in seconds, +ve east&nbsp; &nbsp; Z: d => d.getTimezoneOffset() * -60,&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // ISO 8601 format - UTC&nbsp; &nbsp; // c: d => d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) +&nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; &nbsp; 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) +&nbsp; &nbsp; //&nbsp; &nbsp; &nbsp; &nbsp; '+00:00',&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // ISO 8601 format - local&nbsp; &nbsp; c: d => P.format(d, 'Y-m-d\\TH:i:sP'),&nbsp; &nbsp; // RFC 2822 formatted date, local timezone&nbsp; &nbsp; r: d => P.format(d, 'D, d M Y H:i:s O'),&nbsp; &nbsp; // Seconds since UNIX epoch (same as ECMAScript epoch)&nbsp; &nbsp; U: d => d.getTime() / 1000 | 0&nbsp; };&nbsp;&nbsp;&nbsp; // Helpers&nbsp; // Return day name for date&nbsp; let getDayName = d => d.toLocaleString(P.lang, {weekday:'long'});&nbsp; // Return month name for date&nbsp; let getMonthName = d => d.toLocaleString(P.lang, {month:'long'});&nbsp; // Return [std offest, DST offset]. If no DST, same offset for both&nbsp; let getOffsets = d => {&nbsp; &nbsp; let y = d.getFullYear();&nbsp; &nbsp; let offsets = [0, 2, 5, 9].map(m => new Date(y, m).getTimezoneOffset());&nbsp; &nbsp; return [Math.max(...offsets), Math.min(...offsets)];&nbsp; }&nbsp;&nbsp;&nbsp; // Return ordinal for positive integer&nbsp; let getOrdinal = n => {&nbsp; &nbsp; n = n % 100;&nbsp; &nbsp; let ords = ['th','st','nd','rd'];&nbsp; &nbsp; return (n < 10 || n > 13) ? ords[n%10] || 'th' : 'th';&nbsp; };&nbsp; // Return ISO week number and year&nbsp; let getWeekNumber = d => {&nbsp; &nbsp; let e = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));&nbsp; &nbsp; e.setUTCDate(e.getUTCDate() + 4 - (e.getUTCDay()||7));&nbsp; &nbsp; var yearStart = new Date(Date.UTC(e.getUTCFullYear(),0,1));&nbsp; &nbsp; var weekNo = Math.ceil(( ( (e - yearStart) / 86400000) + 1)/7);&nbsp; &nbsp; return [e.getUTCFullYear(), weekNo];&nbsp; };&nbsp; // Return true if o is a Date, otherwise false&nbsp; let isDate = o => Object.prototype.toString.call(o) == '[object Date]';&nbsp; // Convert numeric minutes to +/-HHMM or +/-HH:MM&nbsp; let minsToHours = (mins, colon) => {&nbsp; &nbsp; let sign = mins < 0? '-' : '+';&nbsp; &nbsp; mins = Math.abs(mins);&nbsp; &nbsp; let H = pad(mins / 60 | 0);&nbsp; &nbsp; let M = pad(mins % 60);&nbsp; &nbsp; return sign + H + (colon? ':' : '') + M;&nbsp; };&nbsp; // Pad single digits with a leading zero&nbsp; let pad = n => (n < 10? '0' : '') + n;&nbsp; // Pad single digits with two leading zeros, double digits with one leading zero&nbsp; let padd = n => (n < 10? '00' : n < 100? '0' : '') + n;&nbsp; // To be completed...&nbsp; let parse = s => 'not complete';&nbsp; P.parse = parse;&nbsp;&nbsp;&nbsp; // Format date using token string s&nbsp; function format(date, s) {&nbsp; &nbsp; // Minimal input validation&nbsp; &nbsp; if (!isDate(date) || typeof s != 'string') {&nbsp; &nbsp; &nbsp; return; // undefined&nbsp; &nbsp; }&nbsp; &nbsp; return s.split('').reduce((acc, c, i, chars) => {&nbsp; &nbsp; &nbsp; // Add quoted characters to output&nbsp; &nbsp; &nbsp; if (c == '\\') {&nbsp; &nbsp; &nbsp; &nbsp; acc += chars.splice(i+1, 1);&nbsp; &nbsp; &nbsp; // If character matches a token, use it&nbsp; &nbsp; &nbsp; } else if (c in tokens) {&nbsp; &nbsp; &nbsp; &nbsp; acc += tokens[c](date);&nbsp; &nbsp; &nbsp; // Otherwise, just add character to output&nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; acc += c;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; return acc;&nbsp; &nbsp; }, '');&nbsp; }&nbsp; P.format = format;&nbsp;&nbsp;&nbsp; return P;}(this);// Examplesconsole.log('Today is ' + P.format(new Date(), 'l, jS \\o\\f F, Y'));let startPWars = new Date(-431,3,25);let endPWars&nbsp; &nbsp;= new Date(-404,0);console.log('The Peloponnesian Wars started on ' +&nbsp;&nbsp; P.format(startPWars, 'd F, Y') +&nbsp; ' and ended in ' +&nbsp; P.format(endPWars, 'Y'));function showDate() {&nbsp; let format = document.getElementById('i0').value;&nbsp; document.getElementById('sp0').textContent = P.format(new Date(), format) || 'invalid tokens';}<input id="i0" placeholder="PHP format, e.g. d-M-Y"><button onclick="showDate()">Show formatted date</button><br><span id="sp0"></span>
打开App,查看更多内容
随时随地看视频慕课网APP