1

私が持っているもの:「2012年8月7日火曜日から2012年8月28日火曜日」という文字列

私が欲しいもの:「8月7日-8月28日」という文字列

唯一の落とし穴は、これを文字列として持っていることです。

「2012年8月31日金曜日午後7時30分から午後9時30分」

結果としてこれが必要になります:「8月31日」

これはGoogleカレンダーフィードからの情報であるため、受信文字列は、ユーザーが開始時刻を入力したかどうかなどによって異なります。ご協力いただきありがとうございます。

4

3 に答える 3

1

ケース1

$string = 'Fri Aug 31, 2012 7:30pm to 9:30pm';

$pieces = explode(' to ', $string);

$d1 = strtotime($pieces[0]);

if(isset($pieces[1])) {
    $d2 = strtotime($pieces[1]);
    if(date('M j', $d1) == date('M j', strtotime($pieces[1], $d1))) {
        echo date('M j', $d1);
    }
    else echo date('M j', $d1) . " - " . date('M j', $d2);
}
else {
    echo date('M j', $d1);
}

結果: 8月31日

ケース2

$string = 'Tue Aug 7, 2012 to Tue Aug 28, 2012';

結果: 8月7日-8月28日

ケース3

$string = 'Tue Aug 7, 2012';

結果: 8月7日

于 2012-08-15T20:47:06.933 に答える
1

このpreg_match_all関数を使用して、ロジックを簡単にすることができます。

$str1 = "Tue Aug 7, 2012 to Tue Aug 28, 2012";
$str2 = "Fri Aug 31, 2012 7:30pm to 9:30pm";

$pattern = '/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d+/';
$numMatches = preg_match_all($pattern, $str1, $dates);

if ($numMatches == 1) // case 2
    echo $dates[0][0];
else // case 1
    echo $dates[0][0]." - ".$dates[0][1];

preg_match_allデモ(テストケース2に$str1を$str2に変更)

MON Dこれは、フォーマットまたは文字列に1つ以上の日付がある場合に機能MON DDします。文字列の残りの部分がどのようにフォーマットされているかは関係ありません。月と日が存在するだけです。

于 2012-08-15T20:49:48.357 に答える
1

このバリアントをチェックしてください:

$ in="2012年8月7日火曜日から2012年8月28日火曜日"; // $ in ="2012年8月31日金曜日午後7時30分から午前4時30分";

$reg = '~(\w{3}) (\w{3}) (\d{1,2}), (\d{4}) (\d{1,2}:\d{2}(?:pm|am) )?to (?:(\w{3}) (\w{3}) (\d{1,2}), (\d{4})|(\d{1,2}:\d{2}(?:pm|am)))~i';
$in = preg_replace_callback($reg, function($m) {
    if (!$m[6] && !$m[9]) {
        return "{$m[2]} {$m[3]}";
    }
    else return "{$m[2]} {$m[3]} - {$m[7]} {$m[8]}";
}, $in);


echo $in;

"Tue Aug 7, 2012 to Tue Aug 28, 2012"プリント用Aug 7 - Aug 28、そして"Fri Aug 31, 2012 7:30pm to 4:30am"あなた用にAug 31

于 2012-08-15T20:56:14.243 に答える