Формат дати та обчислення AppleScript


1

Я працюю з трьома форматами дати,

1. 18.04.2015 (PS дата моєї системи не однакова, але DD / MM / YY)

2. 2 червня 2012 року, але перетворений у 1-й формат за кодом нижче

3. Субота 24 березня 2018 року (поточна дата)

Я щойно створив сценарій внизу, щоб конвертувати обидві дати в одному форматі:

set creationDate to "March 23rd, 2018"
set CreationDay to ""
set Creationmonth to ""
set Creationyear to ""


if creationDate contains "1st" then
    set CreationDay to "1"
end if
if creationDate contains "2nd" then
    set CreationDay to "2"
end if
if creationDate contains "3rd" then
    set CreationDay to "3"
end if
if creationDate contains "4th" then
    set CreationDay to "4"
end if
if creationDate contains "5th" then
    set CreationDay to "5"
end if
if creationDate contains "6th" then
    set CreationDay to "6"
end if
if creationDate contains "7th" then
    set CreationDay to "7"
end if
if creationDate contains "8th" then
    set CreationDay to "8"
end if
if creationDate contains "9th" then
    set CreationDay to "9"
end if
if creationDate contains "10th" then
    set CreationDay to "10"
end if
if creationDate contains "11th" then
    set CreationDay to "11"
end if
if creationDate contains "12th" then
    set CreationDay to "12"
end if
if creationDate contains "13th" then
    set CreationDay to "13"
end if
if creationDate contains "14th" then
    set CreationDay to "14"
end if
if creationDate contains "15th" then
    set CreationDay to "15"
end if
if creationDate contains "16th" then
    set CreationDay to "16"
end if
if creationDate contains "17th" then
    set CreationDay to "17"
end if
if creationDate contains "18th" then
    set CreationDay to "18"
end if
if creationDate contains "19th" then
    set CreationDay to "19"
end if
if creationDate contains "20th" then
    set CreationDay to "20"
end if
if creationDate contains "21st" then
    set CreationDay to "21"
end if
if creationDate contains "22nd" then
    set CreationDay to "22"
end if
if creationDate contains "23rd" then
    set CreationDay to "23"
end if
if creationDate contains "24th" then
    set CreationDay to "24"
end if
if creationDate contains "25th" then
    set CreationDay to "25"
end if
if creationDate contains "26th" then
    set CreationDay to "26"
end if
if creationDate contains "27th" then
    set CreationDay to "27"
end if
if creationDate contains "28th" then
    set CreationDay to "28"
end if
if creationDate contains "29th" then
    set CreationDay to "29"
end if
if creationDate contains "30th" then
    set CreationDay to "30"
end if
if creationDate contains "31st" then
    set CreationDay to "31"
end if

if creationDate contains "2018" then
    set Creationyear to "2018"
end if
if creationDate contains "2017" then
    set Creationyear to "2017"
end if
if creationDate contains "2016" then
    set Creationyear to "2016"
end if
if creationDate contains "2015" then
    set Creationyear to "2015"
end if
if creationDate contains "2014" then
    set Creationyear to "2014"
end if
if creationDate contains "2013" then
    set Creationyear to "2013"
end if
if creationDate contains "2012" then
    set Creationyear to "2012"
end if
if creationDate contains "2011" then
    set Creationyear to "2011"
end if
if creationDate contains "2010" then
    set Creationyear to "2010"
end if
if creationDate contains "2009" then
    set Creationyear to "2009"
end if
if creationDate contains "2008" then
    set Creationyear to "2008"
end if
if creationDate contains "2007" then
    set Creationyear to "2007"
end if
if creationDate contains "2006" then
    set Creationyear to "2006"
end if
if creationDate contains "2005" then
    set Creationyear to "2005"
end if
if creationDate contains "2004" then
    set Creationyear to "2004"
end if
if creationDate contains "2003" then
    set Creationyear to "2003"
end if


if creationDate contains "January" then
    set Creationmonth to "01"
end if
if creationDate contains "February" then
    set Creationmonth to "02"
end if
if creationDate contains "March" then
    set Creationmonth to "03"
end if
if creationDate contains "April" then
    set Creationmonth to "04"
end if
if creationDate contains "May" then
    set Creationmonth to "05"
end if
if creationDate contains "June" then
    set Creationmonth to "06"
end if
if creationDate contains "July" then
    set Creationmonth to "07"
end if
if creationDate contains "Agust" then
    set Creationmonth to "08"
end if
if creationDate contains "September" then
    set Creationmonth to "09"
end if
if creationDate contains "October" then
    set Creationmonth to "10"
end if
if creationDate contains "November" then
    set Creationmonth to "11"
end if
if creationDate contains "December" then
    set Creationmonth to "12"
end if


set CreationfinalDate to CreationDay & "/" & Creationmonth & "/" & Creationyear
return CreationfinalDate

Питання 1: Як я можу конвертувати дату № 3 (яка є поточною датою) у той самий формат

(Я знаю, як повернутися як рядок, але не інакше)

set myDate to date string of (current date)

Питання 2: чи можу я створити сценарій, щоб повідомити мені, чи є різниця між датою 2 та датою 3 протягом 60 днів або поза 60 днів?

Відповіді:


4

Питання 1: Замість того, щоб переживати проблеми з отриманням current dateєдиного для перетворення його в інший формат, ви можете отримати його у потрібному форматі відразу за допомогою команди bash:

    do shell script "date +'%m/%d/%Y'"
        --> 03/24/2018

Запитання 2: Спочатку переформатуйте дату в ту, яку ваша система може розпізнати. У вашому випадку (і в моєму) це dd/mm/yyyy:

    set [M, ordinal, Y] to the words of "June 2nd, 2012"

    set the text item delimiters to {"st", "nd", "rd", "th"}
    set cardinal to (first text item of ordinal) --> "2"
    set cardinal to text -1 thru -2 of ("0" & cardinal) --> "02"

    set the text item delimiters to space
    set date_string to {M, cardinal, Y} as text

    -- date -j -f '%B %d %Y' 'June 02 2012' +'%d/%m/%Y'
    set command to 
        "date -j -f '%B %d %Y'", ¬
        quoted form of the date_string, ¬
        "+'%d/%m/%Y'"}

    do shell script (command as text) --> "02/06/2012"

Потім відніміть одну дату від поточної дати і розділіть на, daysщоб отримати кількість днів між двома датами:

    ((current date) - (date result)) / days
        --> 2121.627

PS. Ви можете використовувати ту саму команду оболонки, щоб перетворити дату у ваш перший формат mm/dd/yyyy, просто перемкнувшись %dі %mв кінці commandрядка.


ДОДАТИ:

Я подумав, що я також покажу вам, як перетворити рядок третьої дати в потрібний формат за допомогою чистого AppleScript. Насправді це можна зробити досить елегантно:

    set today to "Saturday 24 March 2018"

    set [_day, _month, _year] to [day, month, year] of date today
        --> {24, March, 2018}

    set _month to _month * 1 --> 3
    set _month to text -1 thru -2 of ("0" & _month) --> "03"

    set the text item delimiters to "/"
    return {_month, _day, _year} as string
        --> "03/24/2018"

Примітка для інших користувачів: Код у цьому додатку може не працювати для вас, залежно від налаштувань вашої системи. AppleScript сумно метушливий щодо того, що він буде, і не визнає рядок дати. У OP і I, схоже, є однакові або однакові налаштування дати та мови та регіону , що дозволяє todayінтерпретувати змінну правильно як дату AppleScript, тоді як той самий код, який працює в іншій системі, призведе до помилки.

Щоб адаптувати код тут для використання у вашій власній системі, спочатку запустіть команду, get date string of (current date)щоб отримати попередній формат дати, використаний вашою системою, а потім змініть оголошення змінної для todayвідповідності. Крім того, встановіть змінну todayна the date string of (current date).


0

Примусуйте дату до dateоб’єкта AppleScript , тоді ви можете виконати обчислення, такі як set myNewDate to myDate + (2 * days). Для отримання додаткових обчислень дати див. Розрахунки дати / часу за допомогою AppleScript та AppleScript Language Guide - Дата .

Нижче наведено альтернативний підхід до розбору третього, більш багатослівного, формату дати. Цей підхід використовує підпрограми для розділення та обрізки введення. Вона не є повною, але, сподіваємось, корисною:

set myDate to "March 1st, 2018"
set myComponents to my split(myDate, " ")

set myDay to second item of myComponents
set myDay to trim(",rdsth", myDay) as integer

set myMonth to first item of myComponents
set myYear to last item of myComponents as integer

-- ...myDay, myMonth, and myYear are usable

-- http://erikslab.com/2007/08/31/applescript-how-to-split-a-string/
on split(theString, theDelimiter)
    -- save delimiters to restore old settings
    set oldDelimiters to AppleScript's text item delimiters
    -- set delimiters to delimiter to be used
    set AppleScript's text item delimiters to theDelimiter
    -- create the array
    set theArray to every text item of theString
    -- restore the old setting
    set AppleScript's text item delimiters to oldDelimiters
    -- return the result
    return theArray
end split

-- https://macscripter.net/viewtopic.php?id=18519
on trim(theseCharacters, someText)
    -- Lazy default (AppleScript doesn't support default values)
    if theseCharacters is true then set theseCharacters to ¬
        {" ", tab, ASCII character 10, return, ASCII character 0}

    repeat until first character of someText is not in theseCharacters
        set someText to text 2 thru -1 of someText
    end repeat

    repeat until last character of someText is not in theseCharacters
        set someText to text 1 thru -2 of someText
    end repeat

    return someText
end trim

Це теж працює, але це має більше сенсу, я думаю, однак встановив myFinalDae на мій місяць & "/" & myDay & "/" & myYear return "березня / 1/2018" У мене є кращий вигляд за секунду
Кевін,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.