Home  >  Article  >  Backend Development  >  Format golang time for Azure SDK

Format golang time for Azure SDK

WBOY
WBOYforward
2024-02-10 13:03:081248browse

格式化 Azure SDK 的 golang 时间

php Editor Xigua will introduce you how to format the golang time of Azure SDK. When developing using the Azure SDK, you often encounter situations where formatting time is required. Golang provides some built-in time formatting methods, but they may not work properly in Azure SDK. To solve this problem, we need to use a custom method to format the time. Next, let's take a look at how to use golang to format time in Azure SDK.

Question content

Consider the following golang

today :=  time.Now().Format("2006-01-02T03:04:05.9999999Z")
t, _ := time.Parse(time.RFC3339Nano, today)

Why doesn’t this equal the simpler

t := time.Now()

?

Based on my experience so far, I would like to confirm if the above code is equivalent (I think it is), or why it is not equivalent. I've also provided some more background information on what I'm trying.

My complete repository code is located in the main.go file on GitHub. However, for the purpose of this question, let's focus on the code snippet provided below.

sasToken, err := client.ListAccountSAS(
    ctx, resourceGroupName, storageAccountName, armstorage.AccountSasParameters{
    KeyToSign:              to.Ptr("key1"),
    SharedAccessExpiryTime: to.Ptr(func() time.Time { 
        t, _ := time.Parse(time.RFC3339Nano, tomorrow); return t }()),
    Permissions:            to.Ptr(armstorage.PermissionsR),
    Protocols:              to.Ptr(armstorage.HTTPProtocolHTTPSHTTP),
    ResourceTypes:          to.Ptr(armstorage.SignedResourceTypesS),
    Services:               to.Ptr(armstorage.ServicesB),
    SharedAccessStartTime:  to.Ptr(func() time.Time { 
        t, _ := time.Parse(time.RFC3339Nano, today); return t }()),
}, nil)

Currently, this code works as expected. However, when I simplify the last line to t := time.Now() it results in an error (as shown in Github Actions' Run job).

today 2023-09-18T07:54:42.6314723Z should be formatted as 2023-09-16T11:42:03.1567373Z
tomorrow 2023-09-19T07:54:42.6314723Z should be formattes as 2023-09-17T11:42:03.1567373Z
2023/09/18 07:54:43 POST https://management.azure.com/subscriptions/***/resourceGroups/go-azure-sdk/providers/Microsoft.Storage/storageAccounts/golangazure/ListAccountSas
--------------------------------------------------------------------------------
RESPONSE 400: 400 Bad Request
ERROR CODE: InvalidValuesForRequestParameters
--------------------------------------------------------------------------------
{
  "error": {
    "code": "InvalidValuesForRequestParameters",
    "message": "Values for request parameters are invalid: signedStart."
  }
}
--------------------------------------------------------------------------------
exit status 1

This leads me to question why equivalence does not hold, contrary to my initial expectations.

Workaround

The API expects times to be rounded to seconds. So try something like this:

...
            SharedAccessExpiryTime: to.Ptr(expiryTime.Round(time.Second)),
...
            SharedAccessStartTime:  to.Ptr(startTime.Round(time.Second)),
...

The above is the detailed content of Format golang time for Azure SDK. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete