Funciones de fecha para Bicep

En este artículo se describen las funciones de Bicep para trabajar con fechas.

dateTimeAdd

dateTimeAdd(base, duration, [format])

Agrega una duración de tiempo a un valor base. Se esperaba el formato ISO 8601.

Espacio de nombres: sys.

Parámetros

Parámetro Obligatorio Type Descripción
base string Valor datetime inicial para la suma. Utilice el formato de marca de tiempo ISO 8601.
duration string Valor de hora que se suma a la base. Puede ser un valor negativo. Utilice el formato de duración ISO 8601.
format No string El formato de salida del resultado de fecha y hora. Si no se indica, se usa el formato del valor base. Use cadenas de formato estándar o cadenas de formato personalizado.

Valor devuelto

Valor datetime resultado de sumar el valor de duración al valor base.

Comentarios

La función dateTimeAdd no tiene en cuenta años bisiestos y P1Y debe interpretarse como P365D, mientras que P1M debería interpretarse como P30D. En el siguiente archivo de Bicep se muestran algunos ejemplos:

output addOneYearNonLeap string = dateTimeAdd('2023-01-01 00:00:00Z', 'P1Y') //2024-01-01T00:00:00Z
output addOneYearLeap string = dateTimeAdd('2024-01-01 00:00:00Z', 'P1Y')  //2024-12-31T00:00:00Z

output addOneMonthNonLeap string = dateTimeAdd('2023-02-01 00:00:00Z', 'P1M') //2023-03-03T00:00:00Z
output addOneMonthLeap string = dateTimeAdd('2024-02-01 00:00:00Z', 'P1M') //2023-03-02T00:00:00Z

En el ejemplo anterior, considerando 2023 como año no bisiesto, el resultado de agregar un año al día inicial del año es 2024-01-01T00:00:00Z. Por el contrario, agregar un año al día inicial de 2024, un año bisiesto, da como resultado 2024-12-31T00:00:00Z y no 2025-01-01T00:00:00Z, dado que un año bisiesto comprende 366 días en lugar de 365. Además, la distinción entre años bisiestos y no bisiestos se hace evidente al agregar un mes al primer día de febrero, lo que conduce a resultados variables del día del mes.

Ejemplos

En el ejemplo siguiente se muestran distintas formas de sumar valores de hora.

param baseTime string = utcNow('u')

var add3Years = dateTimeAdd(baseTime, 'P3Y')
var subtract9Days = dateTimeAdd(baseTime, '-P9D')
var add1Hour = dateTimeAdd(baseTime, 'PT1H')

output add3YearsOutput string = add3Years
output subtract9DaysOutput string = subtract9Days
output add1HourOutput string = add1Hour

Cuando el ejemplo anterior se implementa con una hora base de 2020-04-07 14:53:14Z, la salida es:

Nombre Tipo Value
add3YearsOutput String 4/7/2023 2:53:14 PM
subtract9DaysOutput String 3/29/2020 2:53:14 PM
add1HourOutput String 4/7/2020 3:53:14 PM

En el ejemplo siguiente se muestra cómo establecer la hora de inicio de una programación de Automation.

param omsAutomationAccountName string = 'demoAutomation'
param scheduleName string = 'demSchedule1'
param baseTime string = utcNow('u')

var startTime = dateTimeAdd(baseTime, 'PT1H')

...

resource scheduler 'Microsoft.Automation/automationAccounts/schedules@2022-08-08' = {
  name: concat(omsAutomationAccountName, '/', scheduleName)
  properties: {
    description: 'Demo Scheduler'
    startTime: startTime
    interval: 1
    frequency: 'Hour'
  }
}

dateTimeFromEpoch

dateTimeFromEpoch(epochTime)

Convierte un valor entero de hora de época en una fecha y hora ISO 8601.

Espacio de nombres: sys.

Parámetros

Parámetro Obligatorio Type Descripción
epochTime int Hora de época que se va a convertir en una cadena datetime.

Valor devuelto

Cadena datetime ISO 8601.

Comentarios

Para esta función se necesita la versión 0.5.X o posterior de la CLI de Bicep.

Ejemplo

En el ejemplo siguiente se muestran los valores de salida para las funciones de hora de época.

param convertedEpoch int = dateTimeToEpoch(dateTimeAdd(utcNow(), 'P1Y'))

var convertedDatetime = dateTimeFromEpoch(convertedEpoch)

output epochValue int = convertedEpoch
output datetimeValue string = convertedDatetime

La salida es la siguiente:

Nombre Tipo Valor
datetimeValue String 2023-05-02T15:16:13Z
epochValue Int 1683040573

dateTimeToEpoch

dateTimeToEpoch(dateTime)

Convierte una cadena datetime ISO 8601 en un valor entero de hora de época.

Espacio de nombres: sys.

Parámetros

Parámetro Obligatorio Type Descripción
dateTime string Cadena datetime que se va a convertir en una hora de época.

Valor devuelto

Entero que representa el número de segundos desde la medianoche del 1 de enero de 1970.

Comentarios

Para esta función se necesita la versión 0.5.X o posterior de la CLI de Bicep.

Ejemplos

En el ejemplo siguiente se muestran los valores de salida para las funciones de hora de época.

param convertedEpoch int = dateTimeToEpoch(dateTimeAdd(utcNow(), 'P1Y'))

var convertedDatetime = dateTimeFromEpoch(convertedEpoch)

output epochValue int = convertedEpoch
output datetimeValue string = convertedDatetime

La salida es la siguiente:

Nombre Tipo Valor
datetimeValue String 2023-05-02T15:16:13Z
epochValue Int 1683040573

En el ejemplo siguiente se usa el valor de hora de época para establecer la expiración de una clave en un almacén de claves.

@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location

@description('The Tenant Id that should be used throughout the deployment.')
param tenantId string = subscription().tenantId

@description('The name of the existing User Assigned Identity.')
param userAssignedIdentityName string

@description('The name of the resource group for the User Assigned Identity.')
param userAssignedIdentityResourceGroupName string

@description('The name of the Key Vault.')
param keyVaultName string  = 'vault-${uniqueString(resourceGroup().id)}'

@description('Name of the key in the Key Vault')
param keyVaultKeyName string = 'cmkey'

@description('Expiration time of the key')
param keyExpiration int = dateTimeToEpoch(dateTimeAdd(utcNow(), 'P1Y'))

@description('The name of the Storage Account')
param storageAccountName string =  'storage${uniqueString(resourceGroup().id)}'


resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' existing = {
  scope: resourceGroup(userAssignedIdentityResourceGroupName)
  name: userAssignedIdentityName  
}

resource keyVault 'Microsoft.KeyVault/vaults@2021-10-01' = {
  name: keyVaultName
  location: location
  properties: {
    sku: {
      name: 'standard'
      family: 'A'
    }
    enableSoftDelete: true
    enablePurgeProtection: true
    enabledForDiskEncryption: true
    tenantId: tenantId
    accessPolicies: [
      {
        tenantId: tenantId
        permissions: {
          keys: [
            'unwrapKey'
            'wrapKey'
            'get'
          ]
        }
        objectId: userAssignedIdentity.properties.principalId
      }
    ]
  }
}

resource kvKey 'Microsoft.KeyVault/vaults/keys@2021-10-01' = {
  parent: keyVault
  name: keyVaultKeyName
  properties: {
    attributes: {
      enabled: true
      exp: keyExpiration
    }
    keySize: 4096
    kty: 'RSA'
  }
}

resource storage 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  properties: {
    accessTier: 'Hot'
    supportsHttpsTrafficOnly: true
    minimumTlsVersion: 'TLS1_2'
    encryption: {
      identity: {
        userAssignedIdentity: userAssignedIdentity.id
      }
      services: {
         blob: {
           enabled: true
         }
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: kvKey.name
        keyvaulturi: endsWith(keyVault.properties.vaultUri,'/') ? substring(keyVault.properties.vaultUri,0,length(keyVault.properties.vaultUri)-1) : keyVault.properties.vaultUri
      }
    }
  }
}

utcNow

utcNow(format)

Devuelve el valor de fecha y hora (UTC) actual en el formato especificado. Si no se proporciona el formato, se usa ISO 8601 (yyyyMMddTHHmmssZ). Esta función solo puede utilizarse en el valor predeterminado para un parámetro.

Espacio de nombres: sys.

Parámetros

Parámetro Obligatorio Type Descripción
format No string El valor codificado por el identificador URI para convertir en una cadena. Use cadenas de formato estándar o cadenas de formato personalizado.

Observaciones

Solo puede usar esta función dentro de una expresión para el valor predeterminado de un parámetro. El uso de esta función en cualquier otro lugar de un archivo de Bicep genera un error. La función no se permite en otras partes del archivo de Bicep porque devuelve un valor diferente cada vez que se le llama. La implementación del mismo archivo de Bicep con los mismos parámetros no produciría de forma confiable los mismos resultados.

Si usa la opción de revertir en caso de error a una implementación correcta anterior y dicha implementación incluye un parámetro que usa utcNow, el parámetro no se vuelve a evaluar. En su lugar, el valor del parámetro de la implementación anterior se reutiliza automáticamente en la implementación de reversión.

Tenga cuidado al volver a implementar un archivo de Bicep que se base en la función utcNow para un valor predeterminado. Si vuelve a implementar y no proporciona un valor para el parámetro, la función se vuelve a evaluar. Si desea actualizar un recurso existente en lugar de crear uno nuevo, pase el valor de parámetro de la implementación anterior.

Valor devuelto

El valor de fecha y hora UTC actual.

Ejemplos

En el siguiente ejemplo se muestran formatos diferentes para el valor de fecha y hora.

param utcValue string = utcNow()
param utcShortValue string = utcNow('d')
param utcCustomValue string = utcNow('M d')

output utcOutput string = utcValue
output utcShortOutput string = utcShortValue
output utcCustomOutput string = utcCustomValue

El resultado del ejemplo anterior varía para cada implementación, pero será similar a:

Nombre Tipo Value
utcOutput string 20190305T175318Z
utcShortOutput string 05/03/2019
utcCustomOutput string 3 5

El ejemplo siguiente muestra cómo usar un valor de la función cuando se establece un valor de etiqueta.

param utcShort string = utcNow('d')
param rgName string

resource myRg 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: rgName
  location: 'westeurope'
  tags: {
    createdDate: utcShort
  }
}

output utcShortOutput string = utcShort

Pasos siguientes